TypeScript中&交叉类型与extends接口继承的类型差异疑问
TypeScript交叉类型与接口继承的属性覆盖差异
核心差异结论
- 交叉类型生成的
B中,a的类型是any;接口继承生成的C中,a的类型是number。
具体原因分析
1. 交叉类型的类型合并规则
交叉类型A & {a: number}会合并两个类型的所有成员,当同一属性存在类型冲突时,会计算类型的交集。但any是TypeScript中的特殊类型,它与任何类型的交叉结果始终是any——因为any可以代表任意类型,和其他类型交叉不会限制它的范围。所以A的a: any和{a: number}交叉后,a的类型最终是any & number = any。
2. 接口继承的属性重写规则
接口继承时,子接口可以直接重写父接口的属性类型,只要子类型是父类型的兼容类型(number是any的子类型,满足兼容性要求)。TypeScript会直接使用子接口中定义的属性类型覆盖父接口的对应属性,因此C的a类型就是number。
代码验证
在TypeScript 4.9.5中查看编辑器类型提示即可确认:
b.a的类型提示为anyc.a的类型提示为number
内容的提问来源于stack exchange,提问作者yanhaijing
相关产品推荐
相关产品推荐

