A 是否是 T 类型?

其实就是 A extends T ? true : false

T[number]

当T是数组类型时,T[number] 表示的是数组里的每个元素的类型。

  1. type Foo = ['a', 'b', 'c']
  2. type FooType = Foo[number] // 'a' | 'b' | 'c'

当T是对象类型时,T[number] 表示对象中属性的类型。比如:

  1. interface Foo1 {
  2. [key: string]: number | string | symbol; // 必须要有这个
  3. x: string;
  4. y: number;
  5. }
  6. type FooType = Foo1[number] // string | number | symbol

但是需要注意的是,对对象类型使用 T[number] 时,必须要有索引签名

对象类型,想获取属性的类型时,也可以这样

  1. type ObjType = {
  2. name: string,
  3. age: number
  4. }
  5. // string | number
  6. type Keys = ObjType[keyof ObjType]

数组至少一个元素

一般的比如 sting[] 表示0到多个,那么至少一个,就是 [string, ...string[]]

字符串类型的匹配

字符换的提取,都可以先考虑通过构造局部字符串的方式,然后不断拆分。

  1. // 根据给定的分隔符(Delimiter)对包含分隔符的字符串进行切割
  2. type Split<
  3. S extends string,
  4. Delimiter extends string,
  5. > = S extends `${infer A}${Delimiter}${infer B}` ? [A, ...Split<B, Delimiter>] : [S]
  6. // 用例
  7. type Item = 'semlinker,lolo,kakuqo';
  8. type ElementType = Split<Item, ','>; // ["semlinker", "lolo", "kakuqo"]

联合类型变交叉类型

  1. type UnionToIntersection<U> = (U extends any? (arg: U) => void : never) extends (arg: infer I) => void ? I : never

这里涉及到 协变、逆变等概念

怎么知道对象类中的可选属性

  1. type Test = {
  2. name?: string,
  3. age: number
  4. }

可选属性,其实就是name可以是string类型,也可以是undefined类型。

  1. type OptionalKeys<T> = {
  2. [K in keyof T as undefined extends T[K] ? K : never]: T[K]
  3. }

去掉 readonly,去掉 可选

直接 - readonly xxxxxx-?

获取数组类型的个数

A是数组类型:A extends any[]

A的长度就是A['length']