Typescript联合与交叉类型组合场景下类型校验未正常报错问题
TypeScript 联合类型校验不生效问题原因及解决方案
问题根因
TypeScript 采用结构类型系统,针对联合类型的多余属性校验有特殊规则:
你定义的Selector是包含TemporalSelector的联合类型,TemporalSelector仅要求存在id: number属性即可符合类型要求。用例e1 = { id: 0, value: "" }满足TemporalSelector的所有必填属性,且value属于联合类型中ValueSelector分支的合法属性,因此不会触发多余属性校验,这就是e1没有报错的核心原因。
修复方案
如果要实现你期望的「只能是纯ValueSelector、纯TemporalSelector、或是同时满足两者的交叉类型,不能出现缺属性的混合情况」,可以通过显式定义三个互斥的联合分支实现:
type Selector = // 仅符合TemporalSelector的分支 | { id: number; type?: never; value?: never } // 仅符合ValueSelector的分支 | { type: "id" | "value_string"; value: string; id?: never } // 同时符合两个类型的交叉分支 | { id: number; type: "id" | "value_string"; value: string }
修改后你原本期望报错的e1就会正常触发类型错误,且所有合法用例的校验逻辑不受影响。
内容的提问来源于stack exchange,提问作者AJP
相关产品推荐
相关产品推荐

