infer 在 条件类型 中使用,用来从另一个类型中 捕获(提取)一个类型到新的类型变量中,之后可以使用。这是针对类型的 pattern-matching。
ts
// Extract the element type of an array
type ElementOf<T> = T extends (infer U)[] ? U : never;
type A = <[]>;
B = <[]>;
infer 在 条件类型 中使用,用来从另一个类型中 捕获(提取)一个类型到新的类型变量中,之后可以使用。这是针对类型的 pattern-matching。
// Extract the element type of an array
type ElementOf<T> = T extends (infer U)[] ? U : never;
type A = <[]>;
B = <[]>;
理解为:"如果 T 与模式 U[] 匹配,则将 U 绑定到元素类型(无论是什么),然后返回它。" infer U 声明一个占位符,编译器通过匹配来填充它。
// the resolved type of a Promise
type Awaited2<T> = T extends Promise<infer R> ? R : T;
type R = Awaited2<Promise<User>>; // User
// a function's return type (this is how ReturnType is built)
type MyReturn<T> = T extends (...args: any[]) => infer R ? R : never;
type X = MyReturn<() => number>; // number
// a function's first parameter
type FirstArg<T> = T extends (a: infer A, ...rest: any[]) => any ? A : never;
type UnwrapBoth<T> =
T extends Promise<infer U> ? UnwrapBoth<U> : // recurse to unwrap nested promises
T extends (infer E)[] ? E : T;
你可以在一个模式中使用多个 infer,甚至递归。
infer 是 ReturnType、Parameters、Awaited 和 InstanceType 等内置类型的幕后功臣,也是库的