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
相关产品推荐
相关产品推荐

