TypeScript中interface赋值为何变量无错而对象字面量报错
TypeScript赋值校验差异原因说明
核心原因是TypeScript的「多余属性检查(Excess Property Checking)」规则仅在特定场景触发,具体原理如下:
1. 基础规则:TypeScript是结构类型系统
TS的类型兼容默认遵循「鸭子类型」原则:只要一个值完全满足目标类型的所有必填属性要求,就算包含额外属性,也被认为和目标类型兼容。
你示例中的subjectObj会被TS自动推导为如下类型:
{ name: string; age: number; height: string; }
该类型完全包含Test接口要求的name和age属性,从结构兼容的角度完全满足Test类型的要求,所以赋值给testObj不会触发兼容性错误。
2. 多余属性检查的触发规则
多余属性检查是TS为了避免开发者手误写错属性、减少无意义多余字段设计的额外校验规则,它仅会在直接赋值「对象字面量」时触发:
- 当你把对象字面量直接赋值给标注了明确类型的变量
- 当你把对象字面量直接作为参数传递给声明了明确参数类型的函数
在这两种场景下,TS会认为你写的字面量就是期望完全匹配目标类型的,多出来的属性大概率是bug,所以会强制校验字面量的所有属性都必须在目标类型的定义中存在。
3. 两个赋值场景的差异解释
- 赋值
testObj的场景:你赋值的是已经声明过的变量subjectObj,不是对象字面量,所以只会走基础的结构兼容校验,不会触发多余属性检查,因此校验通过。 - 赋值
testObj2的场景:你直接传入了对象字面量,触发了多余属性检查,height不在Test接口的定义范围内,因此抛出错误。
补充:如果需要让对象字面量赋值时允许多余属性,可以用类型断言
const testObj2 = { ... } as Test,或者给Test接口添加索引签名interface Test { name: string; age: number; [key: string]: any; }绕过多余属性检查。
内容的提问来源于stack exchange,提问作者Harshit Singh
相关产品推荐
相关产品推荐

