其他的泛型是用参考此链接
映射类型
有时候我们有从旧类型中创建新类型的一个需求场景,TypeScript 提供了映射类型这种方式。 在映射类型里,新类型以相同的形式去转换旧类型里每个属性
比如我们将每个属性成为 readonly 类型,如图
type Readonly<T> = { readonly [P in keyof T]: T[P] };
infer 表示在 extends 条件语句中待推断的类型变量。
在条件类型的 extends 语句中,我们可以用 infer 声明一个类型变量,然后在其分支语句中使用该类型变量。
提取函数参数 & 提取函数返回值
该语句中的(param: infer P)
,为函数首个参数推断声明了一个类型变量 P,如果泛型 T 是一个函数,则根据之前的类型变量 P,提取其推断的函数参数并返回,否则返回原有类型。
type ParamType<T> = T extends (param: infer P) => any ? P : T;
如图所以,成功提取了 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;
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;
可以去掉泛型约束