TypeScript 特殊类型
TypeScript 拥有一些可能不指向任何特定数据类型的特殊类型。
类型:any
any
是一种禁用类型检查并实际上允许使用所有类型的类型。
下面的例子没有使用 any
,将会抛出一个错误:
没有 any 的例子
let u = true; u = "string"; // 错误:类型 'string' 不能分配给类型 'boolean'。 Math.round(u); // 错误:类型为 'boolean' 的参数不能分配给类型为 'number' 的参数。
将特殊类型 any
设置为 true
会禁用类型检查:
带有 any 的例子
let v: any = true; v = "string"; // 没有错误,因为它可以是 “any” 类型 Math.round(v); // 没有错误,因为它可以是 “any” 类型
由于 any
禁用了类型检查,因此它可以作为一种有用的方法来解决错误,但 TypeScript 将无法提供类型安全性,而且依赖类型数据的工具(如自动完成)将无法工作。请记住,应该不惜 “任何” 代价避免使用它......
类型:unknown
unknown
是一种与 any 类似但更安全的替代方案。
TypeScript 将阻止使用 unknown
类型,如下面的例子所示:
let w: unknown = 1; w = "string"; // no error w = { runANonExistentMethod: () => { console.log("I think therefore I am"); } } as { runANonExistentMethod: () => void} // 当我们不知道类型时,如何避免下面注释掉的代码出现错误? // w.runANonExistentMethod(); // Error: Object is of type 'unknown'. if(typeof w === 'object' && w !== null) { (w as { runANonExistentMethod: Function }).runANonExistentMethod(); } // 尽管我们必须多次转换,但我们可以在 if 中进行检查以确保我们的类型安全,并进行更安全的转换
将上面的例子与之前的带有 any
的例子进行比较。
当您不知道要键入的数据类型时,最好使用 unknown
。要稍后添加类型,您需要进行类型转换。
类型转换是当我们使用 “as” 关键字来说属性或变量是属于转换后的类型时。
类型:never
never
在定义时实际上会抛出一个错误。
let x: never = true; // 错误:类型 'boolean' 不能分配给类型 'never'。
never
很少使用,尤其是单独使用,其主要用途是在高级泛型中。
类型:undefined 和 null
undefined
和 null
是分别引用 JavaScript 原语 undefined
和 null
的类型。
let y: undefined = undefined; let z: null = null;
除非在 tsconfig.json 文件中启用了 strictNullChecks
,否则这些类型没有多大用处。