为何TypeScript联合类型ABC无需包含所有属性?
为什么缺少d属性的对象能匹配ABC类型?
先拆解你的类型定义:
A仅要求存在a: number属性AB是A和B的交叉类型,需同时拥有两者的所有属性:{a: number, b: number, c: number, d: number}ABC是A或AB的联合类型,只要对象符合其中任意一个分支即可
核心原因:联合类型匹配规则 + 结构类型系统
TypeScript 采用结构类型系统,只要对象结构满足目标类型的要求就会被判定为兼容。对于 ABC 这个联合类型,TypeScript 只需要检查对象是否能匹配至少一个分支:
你定义的 const a = {a: 1, c: 2} 完全满足 A 类型的要求(包含 a: number),即便多了 c 属性也没问题——A 类型并没有禁止额外属性,只是不强制要求而已。
为什么额外的c不报错,z却会报错?
这和 TypeScript 对对象字面量新鲜性的检查规则有关:
- 直接赋值对象字面量时,TypeScript 会做严格校验,默认不允许出现目标类型未定义的属性,但有个例外:如果多余属性是联合类型中其他分支的合法属性,就不会触发错误。
c是B(以及AB)类型的合法属性,因此这个多余属性被允许;而z既不在A也不在AB的属性列表里,所以直接报错。
验证示例
如果把变量类型改成仅匹配AB,就会触发报错:
const ab: AB = {a: 1, c: 2}; // 报错:缺少b和d属性
这说明你的对象确实是因为匹配了ABC中的A分支,才通过了类型检查。
内容的提问来源于stack exchange,提问作者Samuel Cole
相关产品推荐
相关产品推荐

