请解释如何在泛型中使用推断类型 (Infer)?

推荐答案

在 TypeScript 中,infer 关键字用于在条件类型中推断类型。它通常与 extends 关键字一起使用,用于从泛型类型中提取出某个具体的类型。

例如,假设我们有一个泛型类型 Promise<T>,我们想要提取出 T 的类型。我们可以使用 infer 来实现这一点:

在这个例子中,UnwrapPromise<T> 是一个条件类型。如果 TPromise<U> 类型,那么 U 会被推断出来,并且 UnwrapPromise<T> 的结果就是 U。否则,UnwrapPromise<T> 的结果就是 T 本身。

本题详细解读

1. infer 关键字的作用

infer 关键字用于在条件类型中声明一个待推断的类型变量。它允许我们在类型系统中进行模式匹配,从而提取出某个具体的类型。

2. 使用 infer 的场景

infer 通常用于以下场景:

  • 提取函数返回类型:我们可以使用 infer 来提取函数的返回类型。

    在这个例子中,ReturnType<T> 会提取出函数 T 的返回类型 R

  • 提取数组元素类型:我们可以使用 infer 来提取数组的元素类型。

    在这个例子中,ElementType<T> 会提取出数组 T 的元素类型 U

  • 提取 Promise 的解析类型:我们可以使用 infer 来提取 Promise 的解析类型。

    在这个例子中,UnwrapPromise<T> 会提取出 Promise<T> 的解析类型 U

3. infer 的工作原理

infer 的工作原理是通过模式匹配来推断类型。当 TypeScript 编译器遇到 infer 关键字时,它会尝试从给定的类型中匹配出 infer 后面的类型变量。

例如,在 UnwrapPromise<T> 的例子中,如果 TPromise<string>,那么 infer U 会匹配出 Ustring,因此 UnwrapPromise<T> 的结果就是 string

4. infer 的限制

infer 只能在条件类型的 extends 子句中使用,并且只能用于推断类型变量。它不能用于其他场景,比如直接声明变量或函数参数。

5. 示例代码

以下是一个完整的示例,展示了如何使用 infer 来提取函数返回类型:

在这个例子中,ReturnType<typeof foo> 会提取出 foo 函数的返回类型 number

纠错
反馈