其他的泛型是用参考此链接

映射类型

有时候我们有从旧类型中创建新类型的一个需求场景,TypeScript 提供了映射类型这种方式。 在映射类型里,新类型以相同的形式去转换旧类型里每个属性

比如我们将每个属性成为 readonly 类型,如图

  1. type Readonly<T> = { readonly [P in keyof T]: T[P] };

image.png

infer 表示在 extends 条件语句中待推断的类型变量。
在条件类型的 extends 语句中,我们可以用 infer 声明一个类型变量,然后在其分支语句中使用该类型变量。

提取函数参数 & 提取函数返回值

该语句中的(param: infer P),为函数首个参数推断声明了一个类型变量 P,如果泛型 T 是一个函数,则根据之前的类型变量 P,提取其推断的函数参数并返回,否则返回原有类型。

type ParamType<T> = T extends (param: infer P) => any ? P : T;

TS泛型条件类型推断 - 图2
如图所以,成功提取了 IPrint 的参数类型。
同理如下,提取返回值同样理解~

type ReturnType<T> = T extends (...args: any[]) => infer P ? P : any;

提取构造函数参数类型 & 提取实例类型

下述代码可以提取构造函数参数类型~

type ConstructorParameters<T extends new (...args: any[]) => any> = T extends new (
  ...args: infer P
) => any
  ? P
  : never;


type ConstructorParameters<T> = T extends new (...args: infer P) => any? P : never;

TS泛型条件类型推断 - 图3
T extends new (...args: any[]) => any这里用到了泛型约束,new (...args: infer P)这一句将参数推断声明为类型变量 P。剩余的还是一样的理解~
下述提取实例类型~(和提取构造函数参数类型小有不同~同学们自己发现一下)

type InstanceType<T extends new (...args: any[]) => any> = T extends new (...args: any[]) => infer R
  ? R
  : any;

可以去掉泛型约束