类型断言与收窄
编译器有时不够聪明,或输入来自外部。收窄(narrowing)让类型随控制流变精确;断言是显式告诉编译器「按这个类型看」。
控制流收窄
function len(x: string | string[]) {
if (typeof x === "string") {
return x.length; // string
}
return x.length; // string[]
}
function hasName(v: object): v is { name: string } {
return "name" in v && typeof (v as { name: unknown }).name === "string";
}
常用手段:typeof、instanceof、in、相等判断、自定义类型谓词 x is T。
可辨识联合
type Shape =
| { kind: "circle"; radius: number }
| { kind: "rect"; width: number; height: number };
function area(s: Shape): number {
switch (s.kind) {
case "circle":
return Math.PI * s.radius ** 2;
case "rect":
return s.width * s.height;
}
}
用字面量字段作标签,分支里会自动收窄。
断言:as 与非空
const el = document.querySelector("#app") as HTMLDivElement | null;
const name = maybeName!; // 非空断言:你保证不是 null/undefined
断言不会做运行时转换。错用会把 bug 藏进编译通过的代码。
优先:收窄 → 合法断言 → 最后才 any / 双断言。
要点
- 先写能让控制流收窄的代码
- 可辨识联合是建模利器
as/!是承诺,不是转换- 能收窄就不要断言