概念学习/类型收窄(Type Narrowing)

类型收窄(Type Narrowing)

typescript

通过控制流分析、类型保护使联合类型在分支内被收窄为更具体的类型。

概念定义

TypeScript 会依据条件判断、in、typeof、instanceof、可判定标签(discriminated union)等,对变量类型进行控制流分析与收窄。

代码示例

typeof 与 instanceof 收窄

JavaScript
function print(v: string | Date) {
  if (typeof v === 'string') {
    console.log(v.toUpperCase());
  } else {
    console.log(v.getFullYear());
  }
}

在不同分支中,v 分别被收窄为 string 与 Date。

可判定标签联合

JavaScript
type Shape = { kind: 'circle'; r: number } | { kind: 'rect'; w: number; h: number };
function area(s: Shape) {
  switch (s.kind) {
    case 'circle': return Math.PI * s.r * s.r;
    case 'rect': return s.w * s.h;
  }
}

通过判定字段 kind,分支内类型被精准收窄。

使用场景
  • 处理联合类型的不同分支逻辑
  • 在 API 返回多态数据时进行安全访问
常见错误
  • 忘记处理所有联合分支(建议启用 noFallthroughCasesInSwitch)
前置知识
ts-types
后续主题
ts-utility-types