推荐答案
在 TypeScript 中,infer 关键字用于在条件类型中推断类型。它通常与 extends 关键字一起使用,用于从泛型类型中提取出某个具体的类型。
例如,假设我们有一个泛型类型 Promise<T>,我们想要提取出 T 的类型。我们可以使用 infer 来实现这一点:
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
在这个例子中,UnwrapPromise<T> 是一个条件类型。如果 T 是 Promise<U> 类型,那么 U 会被推断出来,并且 UnwrapPromise<T> 的结果就是 U。否则,UnwrapPromise<T> 的结果就是 T 本身。
本题详细解读
1. infer 关键字的作用
infer 关键字用于在条件类型中声明一个待推断的类型变量。它允许我们在类型系统中进行模式匹配,从而提取出某个具体的类型。
2. 使用 infer 的场景
infer 通常用于以下场景:
提取函数返回类型:我们可以使用
infer来提取函数的返回类型。type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
在这个例子中,
ReturnType<T>会提取出函数T的返回类型R。提取数组元素类型:我们可以使用
infer来提取数组的元素类型。type ElementType<T> = T extends (infer U)[] ? U : never;
在这个例子中,
ElementType<T>会提取出数组T的元素类型U。提取 Promise 的解析类型:我们可以使用
infer来提取Promise的解析类型。type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
在这个例子中,
UnwrapPromise<T>会提取出Promise<T>的解析类型U。
3. infer 的工作原理
infer 的工作原理是通过模式匹配来推断类型。当 TypeScript 编译器遇到 infer 关键字时,它会尝试从给定的类型中匹配出 infer 后面的类型变量。
例如,在 UnwrapPromise<T> 的例子中,如果 T 是 Promise<string>,那么 infer U 会匹配出 U 为 string,因此 UnwrapPromise<T> 的结果就是 string。
4. infer 的限制
infer 只能在条件类型的 extends 子句中使用,并且只能用于推断类型变量。它不能用于其他场景,比如直接声明变量或函数参数。
5. 示例代码
以下是一个完整的示例,展示了如何使用 infer 来提取函数返回类型:
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
function foo(): number {
return 42;
}
type FooReturnType = ReturnType<typeof foo>; // FooReturnType 是 number在这个例子中,ReturnType<typeof foo> 会提取出 foo 函数的返回类型 number。