Typescript
unknown/any
unknown 和 any 类型解析:
unknown 和 any 都是 TypeScript 中用于表示任意类型的类型,但它们之间有一个关键区别:安全性。
| 特性 | any | unknown |
|---|---|---|
| 可赋值给任意类型 | 可以 | 不可以,除非先做类型检查或断言 |
| 类型安全 | 不安全,完全放弃类型检查 | 更安全,使用前必须先检查其类型 |
| 推荐程度 | 不推荐使用(除非万不得已) | 推荐使用(更安全的任意类型) |
使用
any
let value: any = 'hello';
value.toFixed(); // 没报错,但运行时出错,因为字符串没有 toFixed 方法unknown
let value: unknown = 'hello';
value.toFixed(); // 编译错误:Object is of type 'unknown'要使用 unknown,必须先做类型检查:
if (typeof value === 'string') {
console.log(value.toUpperCase()); // OK
}联系
- 都可以接受任意类型的赋值:
let x: any = 123;
let y: unknown = 'abc';
x = true;
y = [1, 2, 3];- 都可以作为逃避类型检查的一种方式,但 unknown 更安全。
使用
-
any:快速原型、老旧项目迁移、第三方库未提供类型。 -
unknown:期望支持任意类型输入但仍保持类型安全的情况下(如处理 JSON、通用函数参数等)。
总结
-
any: 不在乎是它是什么类型。(不在乎所以无所谓, 更随意,也更不安全) -
unknown: 不知道是它是什么类型。(不知道什么所以更安全,需要断言或者类型检查)