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

为何TypeScript中AB与CD两种接口类型可互相赋值?

为什么这两个TypeScript接口可以互相赋值?

先看这两个接口定义:

interface AB {
    a?: string;
    b?: string;
    c?: string;
}

interface CD {
    c?: string;
    d?: string;
    
    a?: string;
}

核心原因在于TypeScript的结构类型系统,以及可选属性的特性:

  1. 结构类型的兼容性规则:TypeScript判断类型是否兼容只看结构(包含的属性、属性类型),不看类型名称。只要目标类型的所有属性要求,源类型都能满足,就允许赋值。
  2. 可选属性的特殊性:带?的可选属性意味着「该属性可以不存在」。比如AB的b是可选的,没有b的对象依然符合AB类型;同理CD的d是可选的,没有d的对象也符合CD类型。
  3. 变量赋值不检查额外属性:把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:57:16