TypeScript 特殊类型
TypeScript 有一些特殊的类型,它们可能不引用任何特定类型的数据。
类型:any
any
是一种禁用类型检查的类型,并且有效地允许使用所有类型。
下面的示例未使用 any
并且会抛出错误
不使用 any
的示例
let u = true;
u = "string"; // 错误:类型“string”不可分配给类型“boolean”。
Math.round(u); // 错误:类型“boolean”的参数不可分配给类型“number”的参数。
亲自试一试 »
将 any
设置为特殊类型 any
会禁用类型检查
使用 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"; // 没有错误
w = {
runANonExistentMethod: () => {
console.log("我思故我在");
}
} as { runANonExistentMethod: () => void}
// 当我们不知道类型时,我们如何避免下面注释掉的代码的错误?
// w.runANonExistentMethod(); // 错误:对象类型为“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
,否则这些类型没有太大用处。