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

理解TypeScript结构化类型系统:两类赋值行为差异咨询

核心原因:TypeScript对新鲜对象字面量有额外属性检查规则,和通用结构化类型规则并行生效

第一个赋值合法的原因:符合结构化类型基础规则

TypeScript的结构化类型系统核心逻辑是:只要源类型完全包含目标类型的所有必填属性、且对应属性类型兼容,两者就类型兼容,可以互相赋值。
你的第一个示例中:

  • Customer 类型要求必须有name: String属性
  • Person 类型实例完全满足这个要求,只是多了一个age属性,结构化类型允许多余属性存在
    因此const cust: Customer = new Person()是完全合法的。

第二个赋值报错的原因:触发了额外属性检查

第二个示例不合法,不是违反结构化类型规则,而是触发了TypeScript专门针对直接赋值的对象字面量设计的额外属性检查规则:
当你直接把一个对象字面量赋值给明确指定了类型的变量,或者直接作为参数传递给期望指定类型的函数时,TS会额外校验这个对象字面量只能包含目标类型中定义过的属性,避免你手误写错属性名、或者多写无效属性。
这个规则是TS额外增加的开发辅助校验,不属于结构化类型的通用规则。你可以通过以下写法绕开这个检查,验证它和结构化类型规则并不冲突:

type Boj = {boj: number};
// 先把对象字面量赋值给无显式类型的变量
const tempObj = {boj: 3, jj: 3};
// 再赋值就不会报错,符合结构化类型规则
let b: Boj = tempObj;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:54:01