为何TypeScript中AB与CD两种接口类型可互相赋值?
为什么这两个TypeScript接口可以互相赋值?
先看这两个接口定义:
interface AB { a?: string; b?: string; c?: string; } interface CD { c?: string; d?: string; a?: string; }
核心原因在于TypeScript的结构类型系统,以及可选属性的特性:
- 结构类型的兼容性规则:TypeScript判断类型是否兼容只看结构(包含的属性、属性类型),不看类型名称。只要目标类型的所有属性要求,源类型都能满足,就允许赋值。
- 可选属性的特殊性:带
?的可选属性意味着「该属性可以不存在」。比如AB的b是可选的,没有b的对象依然符合AB类型;同理CD的d是可选的,没有d的对象也符合CD类型。 - 变量赋值不检查额外属性:把
AB类型变量赋值给CD时,CD只要求有可选的a、c、d——AB已经包含a和c(均为可选),AB的b属于额外属性,TypeScript在变量赋值阶段不会校验这些额外属性,只要目标类型的属性需求被覆盖即可。反过来把CD赋值给AB也是同理:CD有a和c,满足AB的可选要求,AB的b是可选的,没有也符合类型规则。
注意:如果是直接用字面量赋值(比如const cd: CD = { b: 'foo' }),TypeScript会触发额外属性检查并报错,但变量之间的赋值不会有这个限制——因为变量的类型已经确定,额外属性会被忽略。
内容的提问来源于stack exchange,提问作者daflodedeing
相关产品推荐
相关产品推荐

