0031. 类型兼容性
1. 🎯 本节内容
- Type Compatibility
- Structural Type System
- 特殊类型之间的兼容性
2. 🫧 评价
这章内容特别重要,它决定了「一个类型 A」是否可以赋值给「另一个类型 B」的判断标准。
记住一句话:TypeScript 的类型兼容性只管“你有没有我需要的东西”,不“你叫什么名字”。
特殊类型的可赋值性:
- TS 中类型众多,特别是涉及到这些“边缘”类型(any、unknown 和 never)时,经常会搞混它们的赋值关系。
- 比如,什么类型可以赋值给它们?它们又能赋值给什么类型?
- 如果对此有疑问,可以参考「特殊类型的可赋值性」这篇笔记。
本章内容速览:
| 笔记 | 简介 |
|---|---|
| 0067.结构子类型 | TypeScript 采用结构子类型系统,通过检查对象的结构(而非名称)判断类型兼容性,只要对象包含所需属性和方法即可兼容(“鸭子类型”原则),提供灵活性的同时也存在意外兼容风险,可通过品牌类型等技巧增强语义安全性。 |
| 0072.类型的父子关系 | TypeScript 中类型的父子关系由结构子类型系统决定,子类型(如字面量类型、对象超集、可变数组)更具体且能力更强,父类型(如原始类型、对象子集、只读数组)更宽泛且能力更弱,这种关系决定了类型兼容性:父类型 = 子类型(✅兼容),子类型 = 父类型(❌不兼容)。 |
| 0068.对象类型的兼容性规则 | TypeScript对象类型兼容性遵循结构子类型原则,允许超集对象赋值给子集类型(如 B = {x,y} 可赋给 A = {x}),但对直接对象字面量实施“新鲜度检查”以防止拼写错误,同时 readonly 属性不影响兼容性而可选属性会影响兼容性。 |
| 0069.函数类型的兼容性规则 | TypeScript 函数类型兼容性遵循“参数逆变、返回值协变”原则:源函数参数类型可比目标函数更宽泛(父类型→子类型),而返回值类型需比目标函数更具体(子类型→父类型),该规则受 strictFunctionTypes 配置影响且类方法采用宽松双变策略。 |
| 0071.类类型的兼容性规则 | TypeScript类类型兼容性主要遵循结构子类型规则,但私有/受保护成员必须来自同一类或其子类以保证封装安全,静态成员不参与检查,构造函数通常不检查(除非使用参数属性语法糖),且类可与结构匹配的对象字面量兼容但受“新鲜度检查”约束。 |
| 0070.泛型类型的兼容性规则 | 暂无简介 |
| 0017.特殊类型之间的兼容性 | 详细记录了 TypeScript 中特殊类型(any、unknown、object、void、undefined、null 和 never)之间的可赋值性关系,并通过引用官方文档的表格清晰展示了这些类型在不同 strictNullChecks 配置下的兼容性规则,是经常需要查阅的资料之一。 |
| 0080.协变与逆变 | 暂无简介 |
| 0081.双向协变问题 | 暂无简介 |
3. 🤔 什么是 TypeScript 中的类型兼容性?
类型的兼容性(Type Compatibility)是 TypeScript 类型系统的核心机制之一。它决定了"一个类型是否可以赋值给另一个类型",直接影响代码能否通过编译。理解这一机制至关重要,它能帮助你写出更灵活、更安全的代码,并避免常见的类型错误。