TypeScript 中有一些特殊类型很容易混淆。掌握它们的边界,是写出安全代码的重要基础。
any:绕过类型检查
any 表示任意类型。它很方便,但会关闭类型检查。
let value: any = 42;
value = "hello";
value.toFixed();更危险的是,any 可以赋值给任何类型。
let input: any = 9;
let name: string = input; // 可以编译,但不安全因此,除非在迁移旧代码或处理极不确定的数据,否则不要随意使用 any。
unknown:更安全的不确定类型
unknown 也表示不确定类型,但使用前必须先做类型检查。
let value: unknown = "hello";
if (typeof value === "string") {
console.log(value.toUpperCase());
}如果你只是想表达“我现在还不知道它是什么”,优先用 unknown 而不是 any。
void:没有返回值
void 常用于函数返回值,表示调用者不应该依赖它的返回结果。
function log(message: string): void {
console.log(message);
}never:永远不会正常结束
never 表示函数不会正常返回,常见于抛错或无限循环。
function fail(message: string): never {
throw new Error(message);
}它也常用于穷尽检查。
type Status = "success" | "error";
function handle(status: Status) {
switch (status) {
case "success":
return "ok";
case "error":
return "failed";
default:
const exhaustive: never = status;
return exhaustive;
}
}null 与 undefined
undefined 表示未赋值,null 表示显式为空。
开启 strictNullChecks 后,null 和 undefined 不能随便赋给其他类型。
let age: number | null | undefined;
age = 18;
age = null;
age = undefined;严格空值检查可以显著减少空指针类错误。