为何TypeScript中推断类型含额外属性报错,指定类型却正常?
为什么TypeScript里同值的指定类型能通过,但直接传带额外属性的字面量会报错?
这本质是TypeScript的结构类型兼容性和额外属性检查两种机制共同作用的结果:
结构类型兼容性的逻辑
TypeScript用结构类型判断两个类型是否兼容,只要一个类型包含目标类型的所有必填属性,就可以视为兼容的子类型。
例子里的B包含了A的所有属性,所以B是A的子类型。当你把指定为B类型的user传给接受A类型的printUser时,完全符合结构兼容规则,所以不会报错。额外属性检查的特殊规则
当你直接把对象字面量作为函数参数传入时,TypeScript会触发额外属性检查——这是一种专门针对字面量的严格校验,目的是帮你避免拼写错误、误传多余字段这类低级问题。
直接传{ name: 'John', gender: 'male', country: 'USA' }给printUser时,TypeScript会发现这个字面量里有A接口没定义的country属性,于是抛出错误。
简单说:变量赋值走的是结构兼容逻辑,直接传字面量会多一层额外属性校验。如果想绕过这个校验,除了先赋值给变量,也可以用类型断言(比如printUser({...} as A)),不过更推荐前者,代码可读性更好。
内容的提问来源于stack exchange,提问作者Vamshi
相关产品推荐
相关产品推荐

