You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:42:35