收窄(Narrowing)

0 阅读1分钟

收窄就是:当一个变量一开始可能有多种类型(联合类型),TS 会根据你的代码判断,把它在某个代码分支里“缩小成更具体的类型”。

一句话:从“可能是很多种”变成“在这里一定是某一种”。

最经典例子:typeof 收窄

function f(x: string | number) {
  if (typeof x === 'string') {
    // 这里 x 被收窄成 string
    x.toUpperCase()
  } else {
    // 这里 x 被收窄成 number
    x.toFixed(2)
  }
}

常见的收窄方式

  • typeof:区分 string/number/boolean/...
  • 判空:if (x) / if (x != null) 把 null/undefined 排除
  • in:通过属性是否存在区分对象类型
  • 字面量比较(最推荐做“状态机”):if (state.type === 'success') ...
  • instanceof:区分类实例
  • 自定义 type guard:写一个返回 x is SomeType 的函数来帮助收窄

你可以把它理解成

TS 在帮你回答:“在这行代码这里,这个变量到底是什么类型?”你写的判断越明确,TS 收窄越精确,自动补全和报错就越靠谱。