TS

73 阅读1分钟

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长度固定,类型顺序固定