区别
- 类型安全性:
any
类型是完全类型宽松的,它可以绕过TypeScript的类型检查。在使用any
类型时,编译器不会对其进行类型检查,这可能导致运行时错误。例如,你可以将any
类型的值赋值给任何类型的变量,也可以调用不存在的属性或方法而不会在编译时报错。
unknown
类型是类型安全的。它表示值可以是任何类型,但在对其进行操作之前,必须先进行类型检查或断言。这有助于在编译时捕获潜在的类型错误。
- 赋值兼容性:
- 任何类型的值都可以赋值给
any
类型的变量,同时any
类型的值也可以赋值给任何类型的变量。
- 任何类型的值都可以赋值给
unknown
类型的变量,但unknown
类型的值不能直接赋值给其他类型的变量,除非进行类型检查或断言。
使用场景代码示例
any
类型示例
// 定义一个函数,参数为any类型
function logValueAny(value: any) {
console.log(value.length); // 这里不会在编译时报错,即使value可能没有length属性
}
logValueAny('hello');
logValueAny(123); // 虽然123没有length属性,但这里编译不会报错,可能导致运行时错误
unknown
类型示例
// 定义一个函数,参数为unknown类型
function logValueUnknown(value: unknown) {
if (typeof value ==='string') {
console.log(value.length); // 进行类型检查后,这里编译和运行都安全
}
}
logValueUnknown('world');
logValueUnknown(456); // 这里不会执行console.log,因为类型检查不通过