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

TypeScript中extends为何含义不同?如何正确理解?

TypeScript中条件类型extends的两种语义解析

你的困惑核心在于:TypeScript的条件类型里,extends的判断逻辑会根据左右两侧类型的类别不同而变化,主要分为联合类型的子类型判断和对象/接口的结构子类型判断两种场景。

一、联合类型(或基础类型)的整体子类型判断(对应A1、A2案例)

当extends左右两侧是联合类型、字面量类型或基础类型时,判断规则是:左侧的整个类型集合必须是右侧类型集合的子集,也就是左侧的每一个成员都能被右侧类型包含。

  • 示例A1:'x'|'y' extends 'x'
    左侧联合类型包含'x'和'y'两个成员,其中'y'不属于右侧的'x'类型,因此整个联合类型不是'x'的子类型,条件判断为false,结果是number。
  • 示例A2:string|number extends string|number|boolean
    左侧的string和number都被右侧的联合类型包含,整个左侧是右侧的子集,条件判断为true,结果是string。

二、对象/接口类型的结构子类型判断(对应A3案例)

TypeScript对对象类型采用结构类型系统,和Java的名义类型系统(必须显式声明继承)完全不同。判断Test1 extends Test是否成立,只需要看:

Test1是否包含Test的所有必填属性,且对应属性的类型与Test兼容(额外属性不影响判断)

  • 示例A3:test1 extends test
    test接口要求有name:string属性,test1不仅包含了这个属性(类型完全匹配),还额外定义了age:number,完全满足test的结构要求,因此test1被视为test的子类型,条件判断为true,结果是string。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:32:15