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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:00:01