为何TypeScript中顶层对象无法实现类型收窄?
TypeScript类型收窄的设计疑问:为何对象整体未被收窄?
先看这段TypeScript代码:
type PartialPerson = { firstName?: string }; type RequiredPerson = { firstName: string }; function example(myVar: PartialPerson) { if (myVar.firstName) { const compiles: RequiredPerson = { firstName: myVar.firstName } // 编译通过 const doesNotCompile: RequiredPerson = myVar; // 编译失败 } }
这段代码里两个赋值操作看似等价,但实际一个能编译通过,另一个不行。我理解编译器报错是因为没有对myVar进行类型收窄,但疑问在于:TypeScript为何要这么设计?是实现疏漏,还是有我没考虑到的原因?
(注:已有针对「为何无法编译」的解答,此处仅关注语言设计层面的原因)
解答
这是TypeScript目前尚未实现的特性,核心原因是性能考量。
如果要通过检查对象的某个可选属性是否存在,自动将整个对象的类型收窄为该属性必填的版本,编译器需要执行更复杂的全局分析逻辑。这种分析会显著增加类型检查的时间,对于大型代码库来说,编译性能的下降是不可接受的。
目前TypeScript的类型收窄逻辑仅针对直接被检查的表达式本身(比如这里的myVar.firstName),不会自动将收窄效果传导到其所属的父对象(myVar)。该特性已被纳入官方特性请求,相关讨论一直在进行,但出于性能优先级的考量,暂时没有落地。
内容的提问来源于stack exchange,提问作者Yuval P
相关产品推荐
相关产品推荐

