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
相关产品推荐
相关产品推荐

