infer
infer关键字可在 extends 条件语句中推断待推断的类型。
若是在非 extends 条件语句中使用,将会报错。如type F = (data: infer T) => T;,将会报 'infer' declarations are only permitted in the 'extends' clause of a conditional type.ts(1338)
用法:
- 推断函数的参数类型
type FunParams<T> = T extends (...args: infer Args) => any ? Args : T;
type Fun1 = (name: string, age: number) => string;
type Fun1Params = FunParams<Fun1>; // [name: string, age: number]
type Fun2 = (name: string) => number;
type Fun2Params = FunParams<Fun2>; // [name: string]
- 推断函数的返回类型
type FunReturn<T> = T extends (...args: any) => infer R ? R : never;
type Fun1Return = FunReturn<Fun1>; // string
type Fun2Return = FunReturn<Fun2>; // number
实际应用
- 推断数组类型
type Unpacked<T> = T extends (infer R)[] ? R : never;
type Ids = number[];
type Names = string[];
type Users = { id: number; name: string }[];
type Id = Unpacked<Ids>; // number
type Name = Unpacked<Names>; // string
type User = Unpacked<Users>; // {id: number, name: string}
推断数组类型也可直接使用 Ids[number]