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

