type与interface的区别
- type可以表示任意类型,interface只能表示对象类型
- interface支持通过extends继承其他的接口和类,但type不行,只能通过&交叉操作符实现继承效果
- interface具有声明合并的行为,type不具有,因此可以通过interface进行属性扩展
type Shape = { name: string }
type Circle = Shape & { radius: number } //&操作符
interface Car {
name: string
}
interface Car {
num: number
} // Car的类型会合并
union
- 对象进行keyof,会获取到对象值的类型union
- 具有分布式特性,对union的操作会分布到每个union的组合类型上
- 支持通过in进行遍历
union匹配:从union_b中逐个取出,每一个类型都需要和union_a匹配才行。
type union_a = string | number
type union_b = string
type res = union_b extends union_a ? true : false // true
extends在不同场景下的作用
- 表类型约束:
- 表条件判断
- 类扩展
如下所述,MyOmit后紧跟的extends表示类型约束,K必须是T的key的union。第二个extends表示判断,P是否匹配union K。
type MyOmit<T, K extends keyof T> = {
[P in keyof T as P extends K ? never : P]: T[P]
}
infer类型推断
infer只能在条件类型的 extends 子句中使用infer得到的类型只能在true语句中使用, 表示推断成功 如下所示,infer X会自动获取函数返回值的类型,如果infer推断的类型不想使用的话,可以使用 _ 进行代替。 never表示永远不会触发的分支
type MyReturnType<T> = T extends (...args: infer _) => infer X ? X : never
type InferFirst<T extends unknown[]> = T extends [infer P, ...infer _] ? P : never
tuple与数组
- 均支持遍历:
P in T[number],本质是因为T[number]返回了数组元素的union - 均持有length属性
- 数组长度不定,但是tuple长度固定,类型顺序固定