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

