TS 中的 any 和 unknown 有啥区别?

92 阅读1分钟

any

any 类型可以跳过 TS 的类型检查。

我们可以访问 any 类型上的任何属性,也可以当做函数进行调用。也可以给 any 类型的变量赋值任意类型,也可以将任意类型的变量赋值给 any 类型。

let t: any;
t.abc; // 可以访问任何属性
t(); // 当做函数执行
t = 'aa';
t = {}; // 可以被赋值任何类型
const n: number = t; // 可以赋值给任何类型

如果没有指定类型,而 TypeScript 又无法从上下文中推断,编译器通常会默认为任意类型。 想要避免这种情况,因为 any 并不进行类型检查。使用编译器标记 noImplicitAny 可以将隐式 any 标记为错误。

unknown

不能访问 unknown 类型上的属性(使用前可以先进行类型断或类型收缩,缩小类型范围),可以给 unknown 类型赋值任何类型,但是 unknown 类型不能赋值给 any 和 unknown 本身以外的类型。

let t: unknown;
t.abc; // 报错,“t”的类型为“未知”
t = 'aa';
t = {};  // 可以被赋值任何类型
const n: number = t; // 报错,不能将类型“unknown”分配给类型“number”。
const a: any = t; // 可以赋值给 any 类型