fe-interview
fe-interview copied to clipboard
[TypeScript] 第1515天 在TypeScript中any和unkown有什么区别?
虽然都是表示未知类型,但是any上任何操作都是合法的,unknown类型上任何操作都是非法的
any 类型可以赋予任意值,并且对其进行任意操作不会报错,不进行类型检查。 unknown 类型也可以赋予任意值,但对其进行操作时必须进行类型检查或类型断言,提供了更安全的方式来处理类型不确定的情况。
一般来说,应尽量避免使用 any 类型,因为它会降低 TypeScript 的类型检查能力,增加代码的不确定性。相比之下,unknown 类型提供了更严格的类型检查,能够在编写类型安全的代码时更好地处理类型不确定的情况。
在TypeScript中,any和unknown都是可以表示任意类型的顶级类型,但它们的行为和用途有很大的区别。了解它们之间的区别对于编写类型安全的代码至关重要。
any 类型
- 宽松的类型检查:使用
any类型,TypeScript基本上会放弃对该变量的类型检查。这意味着你可以对any类型的值进行任何操作,而不会得到编译错误。 - 缺乏类型安全性:
any类型的主要缺点是它缺乏类型安全性。使用any类型可能会导致在运行时出现类型错误,因为编译器无法捕获类型错误。
示例:
let value: any;
value = 42;
value = "hello";
value = true;
value.foo(); // 没有编译错误,但在运行时可能会崩溃
value.bar = 123;
unknown 类型
- 严格的类型检查:
unknown类型提供了类型安全性。你可以将任何类型的值赋给unknown类型的变量,但在对它进行操作之前,你必须先进行类型检查或类型断言。 - 类型安全:使用
unknown类型,可以确保在使用变量之前进行必要的类型检查,从而提高代码的安全性和可靠性。
示例:
let value: unknown;
value = 42;
value = "hello";
value = true;
// 不能直接对unknown类型的值进行操作,需要进行类型检查或类型断言
if (typeof value === "string") {
console.log(value.toUpperCase()); // 现在编译器知道value是一个字符串
}
if (typeof value === "number") {
console.log(value.toFixed(2)); // 现在编译器知道value是一个数字
}
any vs unknown 的对比
-
赋值兼容性:
any和unknown都可以接受任何类型的值。- 任何类型的值都可以赋给
any。 - 任何类型的值都可以赋给
unknown。
-
操作限制:
- 对
any类型的值可以进行任何操作,而不会有编译错误。 - 对
unknown类型的值进行操作之前,必须进行类型检查或类型断言。
- 对
-
类型安全性:
any类型会导致类型检查的丧失,可能会引入运行时错误。unknown类型提供了类型安全性,确保在使用之前进行类型检查,从而减少运行时错误。
示例对比
使用 any
function logValue(value: any) {
console.log(value.toFixed(2)); // 没有编译错误,但如果value不是数字,运行时会出错
}
logValue(123.456); // 正常工作
logValue("hello"); // 运行时错误
使用 unknown
function logValue(value: unknown) {
if (typeof value === "number") {
console.log(value.toFixed(2)); // 编译器知道value是数字
} else {
console.log("Not a number"); // 处理非数字情况
}
}
logValue(123.456); // 正常工作
logValue("hello"); // 输出: Not a number
总结
any:提供灵活性,但缺乏类型安全性。适用于快速原型开发或需要临时禁用类型检查的情况,但不推荐在生产代码中广泛使用。unknown:提供类型安全性,适用于处理不确定类型的值。需要在使用之前进行类型检查或类型断言,是更推荐的做法。
使用unknown类型可以显著提高代码的安全性和可靠性,避免许多运行时错误,而any类型虽然方便但可能会导致隐蔽的错误。