TypeScript 特殊类型

TypeScript 有一些特殊类型,它们可能不会引用任何特定类型的数据。


类型: any

any 是一种禁用类型检查并有效地允许使用所有类型的类型。

下面的实例不使用 any,并将抛出一个错误:

不使用 any 的实例:

  1. let u = true;
  2. u = "string"; // Error: Type 'string' is not assignable to type 'boolean'.
  3. u.runANonExistentMethod(); // Error: Property 'runANonExistentMethod' does not exist on type 'boolean'.
  4. console.log(Math.round(u)); // Error: Argument of type 'boolean' is not assignable to parameter of type 'number'.

any 设置为特殊类型 any 将禁用类型检查:

使用 any 的实例:

  1. let v: any = true;
  2. v = "string"; // no error as it can be "any" type
  3. // v.runANonExistentMethod();
  4. // no type error in the editor, but will still throw an error if commented in
  5. console.log(Math.round(u)); // no error as it can be "any" type
any 很容易引发错误,因为它禁用了类型检查,但TypeScript 将无法提供类型安全性,并且依赖类型数据的工具(如自动完成)将无法运行,所以尽量避免使用它。

类型: unknown

unknownany 类似,但更安全。

TypeScript 将阻止使用 unknown 类型,如下例所示:

  1. let w: unknown = 1;
  2. w = "string"; // no error
  3. w = {
  4. runANonExistentMethod: () => {
  5. console.log("I think therefore I am");
  6. }
  7. } as { runANonExistentMethod: () => void }
  8. // How can we avoid the error for the code commented out below when we don't know the type?
  9. // w.runANonExistentMethod(); // Error: Object is of type 'unknown'.
  10. if(typeof w === 'object' && w !== null) {
  11. (w as { runANonExistentMethod: Function }).runANonExistentMethod();
  12. }
  13. // Although we have to cast multiple times we can do a check in the if to secure our type and have a safer casting

将上面的实例与前面的使用 any 的实例进行比较。

当您不知道要输入的数据类型时,最好使用 unknown。若要稍后添加类型,需要将其强制转换。

强制转换是指我们使用 "as" 关键字表示属性或变量属于强制转换类型。

类型: never

无论何时定义错误,never 都会有效地抛出错误。

  1. let x: never = true; // Error: Type 'boolean' is not assignable to type 'never'.
never 很少使用,尤其是它本身,主要用于高级泛型。

类型: undefined & null

undefinednull 是分别引用 undefined 和 null 的 JavaScript 原生类型。

  1. let y: undefined = undefined;
  2. console.log(typeof y);
  3. let z: null = null;
  4. console.log(typeof z);
除非在 tsconfig.json 文件中启用 strictNullChecks,否则这些类型没有多大用处。