# interface 与 type 的异同点
- 基础
- 在对象扩展情况下,
interface
使用extends
关键字,type
使用交叉类型 (&
) - 同名的
interface
会自动合并,并且在合并时会要求兼容原接口的结构 interface
与type
都可以描述对象类型、函数类型、Class 类型,但interface
无法像type
那样表达元组、一组联合类型等interface
无法使用映射类型等类型工具,即在类型编程场景中应该使用type
- 用
interface
来定义对象,用类型别名来处理函数签名、联合类型、工具类型等等
- 在对象扩展情况下,
- 进阶
interface
就是描述对象对外暴露的接口,不应该具有过于复杂的类型逻辑,最多局限于泛型约束和索引类型- 类型别名(
type
)用于将一组类型重命名,或者对类型进行复杂编程 - 在对象扩展时,使用接口继承要比交叉类型性能更好
# 类型兼容比较
- 基础
- TypeScript 使用鸭子类型,即结构化类型系统进行类型兼容性比较
- 对于两个属性完全一致的类型,就认为它们属于同一种类型
- 对于 A 类型、A B 类型,认为后者是前者的子类型,(A B 比 A 更多信息)
- 对于
object
{}
和 Top Type 存在部分特殊规则
- TypeScript 使用鸭子类型,即结构化类型系统进行类型兼容性比较
- 进阶
- 结构化类型系统到标称类型系统
- 类型层次
- 类型兼容性的比较本质上也是在类型层次中进行比较,一个类型能兼容其子类型
# any、unknown 与 never
- 基础
any
与unknown
在 TypeScript 类型层级中属于最顶层的 Top Type,即所有类型都是其子类型never
作为 Bottom Type 是所有类型的子类型
- 进阶
- 为什么需要 Top Type 和 Bottom Type
- 不能保证对所有地方的类型都进行精确描述,所以需要 Top Type 来表示一个包含任意类型的类型
- 在类型编程中,如果对两个不存在交集的类型强行进行交集运算,需要一个类型描述这种不存在的类型,所以需要 Bottom Type
- 类型层级
- 从 Bottom 向上到 Top 的类型链
- 条件类型
- 在条件类型中存在对于 Bottom Type 和 Top Type 的特殊处理
- 为什么需要 Top Type 和 Bottom Type
# 工具类型实现
- 基础
Partial
、Required
Pick
、Omit
ReturnType
、ParameterType
- 进阶
DeepPartial
、DeepRequired
MarkAsPartial
、PickByType
- 工具类型分类
- 访问性修饰工具类型
- 结构处理工具类型
- 集合工具类型
- 模式匹配工具类型