为什么TypeScript传入含多余属性的对象时不触发类型错误?
为什么这段TypeScript代码未抛出类型错误?
首先明确TypeScript的两个核心检查规则:
1. 直接传递对象字面量的默认行为
默认情况下,像fn1({ key: 1, a: 1 })这种直接传递带额外属性的对象字面量给函数参数,TypeScript会触发额外属性检查,抛出类似「对象字面量只能指定已知属性,'a'不在类型'{ key: number; }'中」的错误。
如果你的代码没有报错,大概率是项目的tsconfig.json中开启了suppressExcessPropertyErrors: true,这个配置会关闭额外属性检查,允许字面量携带多余属性。
2. 先赋值给变量再传递的兼容规则
如果你的代码实际是先把对象赋值给变量再传参:
const obj = { key: 1, a: 1 }; fn1(obj);
此时不会报错是因为TypeScript采用结构类型系统:只要变量的类型包含目标参数类型的所有必填属性,就视为类型兼容。obj的推断类型是{ key: number; a: number },它完全覆盖了{ key: number }的要求,因此可以安全传递,额外属性不会触发检查——这和直接传字面量的规则不同。
如果你的代码确实是直接传字面量却无报错,先检查tsconfig.json的suppressExcessPropertyErrors配置,或者确认TypeScript版本是否过低(建议升级到最新稳定版)。
内容的提问来源于stack exchange,提问作者Zixuan Tang
相关产品推荐
相关产品推荐

