TypeScript中展开含额外属性的变量赋值无报错的原因咨询
问题
在以下代码中,TypeScript会对t2_2的赋值操作报错(提示“无法赋值”),但对t2_1的赋值操作不报错——t2_1是将包含额外属性“x”的变量tx展开后进行赋值的。请问为何TypeScript不对t2_1的赋值操作报错?
type Type1 = { a: number; b: number; } type Type2 = { t1: Type1 s: string; } let t1: Type1 = {a:1,b:2} let tx = {x:2}; let t2_1: Type2 = { t1, s: "asdf", ...tx } let t2_2: Type2 = { t1, s: "asdf", x: 3 }
解析
这是TypeScript**额外属性检查(Excess Property Checks)**机制的特性导致的:
- 直接在对象字面量中写入目标类型未定义的属性时(比如
t2_2里的x: 3),TypeScript会触发额外属性检查并报错——这是为了帮你排查拼写错误或冗余属性这类常见问题。 - 通过展开变量(比如
...tx)引入额外属性时,TypeScript不会触发额外属性检查。因为变量的类型可能存在动态变化的可能,TypeScript无法确定该变量的属性是否是有意合并到目标对象中的,因此会放宽这部分的检查限制。
简单总结:TypeScript对对象字面量中的额外属性会做严格校验,而对通过变量展开添加的额外属性则不做强制校验。
内容的提问来源于stack exchange,提问作者andreash
相关产品推荐
相关产品推荐

