推荐答案
在 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
。