Typescript - 在条件类型中推断(Infer)类型

这篇文章是帮大家学习如何在条件类型中提取和使用类型。

理解 infer 关键字

有一个 infer 关键字可以在条件类型的条件中使用,以将推断的类型放入变量中。 然后可以在条件分支中使用该推断变量。考虑下面的简单示例,如果类型是数组,则给出数组元素类型:

构造 item1 时,条件类型中的条件为真,因为 number[] 匹配 (infer E)[]。 因此,在此匹配过程中,E 被推断为数字。 返回条件的第一个分支 E,它被解析为数字。

构造 item2 时,条件类型中的条件为 false,因为 {name: string} 不匹配 (infer E)[]。 因此返回条件的第二个分支 T,即传入的原始参数 {name: string}。

更复杂的例子

我们将在下面的代码编辑器中使用 infer 关键字创建一个条件类型。

该代码包含两个返回不同对象的函数。 该代码还包括这两个函数的类型。

我们将创建一个名为 FunctionReturnType 的实用程序类型,它将给出函数的返回类型,最终将使用 FunctionReturnType 创建一个由两个函数的返回类型组成的联合类型。

  • 让我们开始为 FunctionReturnType 创建一个类型别名:
type FunctionReturnType
  • FunctionReturnType 添加条件
type FunctionReturnType = T extends (...args: any) => infer R

我们的条件是传入的类型与函数签名匹配。 我们已经推断出要将函数的返回类型放入 R 参数中。

  • 将逻辑分支添加到条件类型
type FunctionReturnType = T extends (...args: any) => infer R ? R : T;

如果条件为真,则返回 R 参数,这是函数的返回类型。 如果条件为假,则返回传入的原始类型 T。

  • 创建一个名为 Actions 的联合类型,该类型由使用 FunctionReturnType 的 addPerson 和 removePerson 函数的返回类型组成。

Actions现在跟下面的类型是一样的:

不错吧。现在试着给 FunctionReturnType 传入一个对象:

现在那个 PersonType 类型就是对象本身的签名。

总结:

infer 关键字允许从条件类型的条件中提取类型。 这通常在 Typescript 的标准实用程序类型中使用。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章