为何TypeScript类型守卫后notUser类型为{items:any[]}&User而非User?
为什么类型守卫后变量类型是
{items: any[]} & User而非User? 这是因为TypeScript的类型守卫做的是类型窄化,而非直接替换原类型。
你定义的notUser初始类型是{items: any[]},不管用asserts断言还是类型谓词isUser,TypeScript只会确认这个变量同时满足User的结构要求,但不会丢弃它原本就有的类型信息。所以最终的类型是原类型和User的交集(&),表示这个变量既拥有User的所有属性,也保留了自身的items属性。
示例1分析
用asserts obj is User断言时,TypeScript会认为:既然断言通过了,说明notUser肯定符合User的结构,但它原本就有items属性这个事实不会被抹除,所以类型合并成{items: any[]} & User。
示例2分析
在if(isUser(notUser))的代码块里,类型谓词同样是窄化逻辑:TypeScript确认notUser满足User的条件,但不会忽略它初始的items属性,因此在块内的类型也是两者的交集。
如果你的预期是让变量类型严格等于User,可以通过类型断言强制转换,比如const user = notUser as User,但这样会丢失items的类型信息。TypeScript默认保留交集类型,其实是更准确反映变量的实际结构——它确实同时拥有User的id属性和自己的items属性。
内容的提问来源于stack exchange,提问作者programmer
相关产品推荐
相关产品推荐

