unknown 和 any 的区别类型安全性:
any 是完全不受限制的,可以对其进行任何操作(调用方法、访问属性等),而不会有类型检查。这可能导致运行时错误。unknown 是受限制的,在对 unknown 类型的值进行任何操作之前,必须先进行类型检查或类型断言。默认类型检查:
any 取消了所有的类型检查,使用 any 的地方 TypeScript 不会提供类型错误提示。unknown 保留了类型检查的能力,要求开发者先明确知道类型,然后再进行操作。any 的不安全操作let anything: any = "hello";
anything.toFixed(); // 运行时错误:因为字符串没有 `toFixed` 方法
解释:
"hello" 是字符串,但由于使用了 any,TypeScript 允许你调用 toFixed() 方法,这会导致运行时错误。unknown 的类型安全let unknownValue: unknown = "hello";
// 直接调用 `toFixed` 会报错
// unknownValue.toFixed(); // 编译时错误
if (typeof unknownValue === "number") {
// 现在 TypeScript 知道 unknownValue 是 number 类型
console.log(unknownValue.toFixed(2));
} else {
console.log("不是数字类型");
}
解释:
unknownValue 的类型是 unknown,TypeScript 不允许直接调用 toFixed,必须先检查类型。unknownValue 是 number 类型后,才能调用 toFixed 方法,这样可以避免运行时错误。unknownlet someValue: unknown = "hello";
let strLength: number = (someValue as string).length; // 类型断言
console.log(strLength); // 输出: 5
解释:
(someValue as string) 告诉 TypeScript someValue 是字符串类型,然后再访问字符串的 length 属性。unknown 而不是 any?unknown: 当你确实不确定某个值的类型,但仍然希望保持类型检查的严格性时,应使用 unknown。any: 如果你需要完全绕过 TypeScript 的类型检查机制,可以使用 any,但这通常是不推荐的。unknown 和 any 都可以表示任意类型的值,但 unknown 是更安全的选择,因为它要求在对值进行操作之前进行类型检查或类型断言,从而减少了潜在的运行时错误风险。