TypeScript 特殊类型
TypeScript 具有可能不指向任何特定数据类型的特殊类型。
类型:any
any
是一个禁用类型检查并允许使用所有类型的类型。
下面的示例未使用 any
,并且会引发错误
不使用 any
的示例
let u = true;
u = "string"; // Error: Type 'string' is not assignable to type 'boolean'.
Math.round(u); // Error: Argument of type 'boolean' is not assignable to parameter of type 'number'.
自己动手试一试 »
将 any
设置为特殊类型 any
会禁用类型检查
使用 any
的示例
let v: any = true;
v = "string"; // no error as it can be "any" type
Math.round(v); // no error as it can be "any" type
自己动手试一试 »
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; // Error: Type 'boolean' is not assignable to type 'never'.
自己动手试一试 »
never
很少使用,尤其是单独使用时,它的主要用途是在高级泛型中。
类型:undefined & null
undefined
和 null
是分别指向 JavaScript 原语 undefined
和 null
的类型。
let y: undefined = undefined;
let z: null = null;
自己动手试一试 »
除非在 tsconfig.json
文件中启用了 strictNullChecks
,否则这些类型的用途不大。