You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:08:29