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

TypeScript联合类型中never属性与多余属性报错的疑问

联合类型的多余属性检查逻辑解析

先看示例代码:

type data1={x:string, q?:never, y:string}
type data2={p:string, q:boolean, r:number}
type data3= data1|data2 

let v1:data3={x:"tree", y:"flower", r:45}        //OK
let v2:data3={p:"sigma",q:true,r:100, x:"tree"}   // ERROR

疑问

为何v1包含多余属性r能通过类型检查,而v2包含多余属性x却报错?

原因解析

这是TypeScript联合类型的多余属性检查逻辑导致的,核心看对象能否被归为联合类型中的某一个成员:

  • v1的情况:它包含data1要求的必填属性x和y,虽然多了r,但TypeScript会优先尝试将其匹配到data1类型。data1中的q是可选的never类型,可选属性可以不提供;而多余的r属性在类型检查时会被忽略(只要对象能匹配到联合类型里的某一个成员,非严格模式下多余属性不会触发报错)。因此v1能被识别为data1的实例,符合data3的联合类型要求。
  • v2的情况:它包含data2要求的必填属性p、q、r,但多了x。此时TypeScript尝试匹配data2,但data2并没有x属性;再尝试匹配data1,data1要求必须有y属性,而v2里没有,同时data1的q是可选never类型,和v2中q: boolean的类型冲突。v2既不符合data1也不符合data2的类型要求,所以触发报错。

总结:联合类型的检查逻辑是判断对象能否完全符合其中某一个成员类型,多余属性只要不影响匹配到某个成员就不会报错;但如果多余属性导致对象无法匹配到任何一个成员,就会触发类型错误。

内容的提问来源于stack exchange,提问作者Mat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:12:09