收窄就是:当一个变量一开始可能有多种类型(联合类型),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 收窄越精确,自动补全和报错就越靠谱。