跳到主要内容

类型断言与收窄

编译器有时不够聪明,或输入来自外部。收窄(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 / 双断言。

要点​

  1. 先写能让控制流收窄的代码
  2. 可辨识联合是建模利器
  3. as / ! 是承诺,不是转换
  4. 能收窄就不要断言