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

TypeScript中为何a=b赋值额外属性不报错?

为什么a = b不报错但a = {z: 1}报错?

先看对应的代码示例:

type A = {
    x?: number
    y?: number
}

type B = {
    x?: number
    z: number
}

let a: A = {}
let b: B = {z: 1}

a = b // 不报错
a = {z: 1} // 报错

核心原因分两点:

  • TypeScript的结构化类型兼容性:TypeScript采用结构化类型系统,判断类型兼容只看结构——只要目标类型(这里是A)的所有属性,源类型(这里是B)都能满足,就可以赋值。A的属性都是可选的x和y,B包含了可选的x,而y是可选属性,不存在也不影响兼容性,所以B类型的b可以赋值给A类型的a。
  • 对象字面量的额外属性检查:当直接把对象字面量(比如{z: 1})赋值给变量时,TypeScript会触发额外的严格检查,不允许出现目标类型里未定义的属性。但b是已经被声明为B类型的变量,不是直接的对象字面量,所以不会触发这个检查,自然不会报错。

总结:变量之间的赋值只看类型结构是否兼容,而直接用对象字面量赋值时,会额外校验是否存在多余属性。

内容的提问来源于stack exchange,提问作者rjurado01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:48:46