🔓 any 类型
any 类型可以赋值任何类型,关闭类型检查。
// any 类型可以接受任何值
let anything: any;
anything = 'hello';
anything = 42;
anything = { name: 'Alice' };
anything = [1, 2, 3];
anything = () => console.log('function');
// 可以调用任意方法(编译时不报错,运行时可能出错)
anything.toUpperCase(); // 可能运行时错误
anything.nonExistentMethod(); // 可能运行时错误
// any 类型会传染
let data: any = getData();
let result = data.name; // result 也是 any 类型
⚠️
any 的危险
使用 any 会失去 TypeScript 的类型安全保护,应该尽量避免使用。any 类型会传染,影响相关代码的类型安全。
🔒 unknown 类型
unknown 是类型安全的 any,使用前必须进行类型检查。
// unknown 类型可以接受任何值
let value: unknown;
value = 'hello';
value = 42;
value = { name: 'Alice' };
// 不能直接使用(安全!)
value.toUpperCase(); // Error: 'value' 是 'unknown' 类型
value.toFixed(); // Error: 'value' 是 'unknown' 类型
// 必须先进行类型检查或类型断言
if (typeof value === 'string') {
console.log(value.toUpperCase()); // OK
}
if (typeof value === 'number') {
console.log(value.toFixed(2)); // OK
}
💻 类型收窄示例
function processValue(value: unknown) {
// typeof 类型守卫
if (typeof value === 'string') {
return value.toUpperCase();
}
if (typeof value === 'number') {
return value * 2;
}
// instanceof 检查
if (value instanceof Date) {
return value.toISOString();
}
// 自定义类型守卫
if (isUser(value)) {
return value.name;
}
// 类型断言(谨慎使用)
return (value as { name: string }).name;
}
// 自定义类型守卫
function isUser(value: unknown): value is User {
return typeof value === 'object' && value !== null && 'name' in value;
}