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

undefinednull 是分别引用 JavaScript 原语 undefinednull 的类型。

let y: undefined = undefined;
let z: null = null;

亲自试一试

除非在 tsconfig.json 文件中启用了 strictNullChecks,否则这些类型没有多大用处。