为何TypeScript中返回D类型却未触发返回类型不匹配错误?
问题原因解析
这是因为TypeScript采用结构类型系统,而非传统面向对象语言常用的名义类型系统,具体原因如下:
- TypeScript判断类型兼容性的核心依据是类型的结构是否匹配,而非类的名称或继承关系。
- 示例中的
C和D类结构完全一致:都包含一个类型为number的公共属性p,因此D的实例在结构上完全符合C类型的要求。 - 当函数
createLabel声明返回类型为C时,返回D的实例不会触发类型错误——因为从结构上看,D实例满足C类型的所有约束。
你可以做个验证:如果给其中一个类添加不同属性,比如给D新增q: string,此时返回D实例就会触发类型错误,因为结构不再兼容:
class C { p: number = 3; } class D { p: number = 21321; q: string = "test"; // 新增属性 } function createLabel(nameOrId: number): C { let a = new D(); return a; // 此处会触发类型错误,结构不匹配 }
内容的提问来源于stack exchange,提问作者xdd
相关产品推荐
相关产品推荐

