TypeScript中的`infer`关键字

3,230 阅读4分钟

infer关键字

在TypeScript中,infer是一个关键字,用于在条件类型(conditional types)中推断(infer)类型参数。通过使用infer关键字,我们可以在类型系统中进行类型的自动推断,从而实现更加灵活和可复用的类型定义。

使用场景

infer关键字通常用于条件类型(conditional types)中,条件类型是TypeScript中的高级类型操作符之一。通过条件类型,我们可以根据某个类型的特性,在类型系统中进行条件分支和类型的变换。

使用语法

在条件类型中使用infer关键字时,通常会将inferextends关键字一起使用,形式如下:

type MyType<T> = T extends SomeType<infer U> ? U : never;

在上述示例中,infer U表示我们希望TypeScript根据泛型类型T的特性推断出一个新的类型U。如果T满足SomeType条件,则返回U类型,否则返回never类型。

示例

  1. 使用 infer 关键字获取 Person.name 的类型 让我们通过一个示例来说明infer关键字的使用。假设我们有一个类型Person,它包含名字和年龄两个属性:
type Person = {
  name: string;
  age: number;
};

现在,我们希望从Person类型中提取出只包含名字的子类型。我们可以使用infer关键字来实现这个目标:

type ExtractName<T> = T extends { name: infer U; age: number } ? U : never;

在上述示例中,ExtractName是一个条件类型,它根据传入的泛型类型T是否满足{ name: infer U; age: number }条件进行分支。如果满足条件,则返回infer U中推断的类型U,即名字的类型;否则返回never类型。

我们可以使用ExtractName来提取Person类型中的名字:

type NameOnly = ExtractName<Person>; // 类型为 string

通过使用infer关键字,我们成功地从Person类型中提取出了名字的类型,并将其应用于新的类型NameOnly

当然,下面是一篇使用infer关键字来获取函数参数类型的文章:

  1. 使用 infer 关键字获取函数参数类型
type Parameters<T> = T extends (...args: infer P) => any ? P : never;

在上述语法中,T表示待推断类型,(...args: infer P) => any表示函数类型,infer P表示我们希望从函数类型中推断出的参数类型。

让我们通过一个示例来说明如何使用infer关键字来获取函数参数类型。假设我们有一个函数sum,用于计算两个数字的和:

function sum(a: number, b: number): number {
  return a + b;
}

现在,我们希望通过使用infer关键字来获取函数sum的参数类型。我们可以定义一个条件类型Params来实现这个目标:

type Params<T> = T extends (...args: infer P) => any ? P : never;

在上述示例中,Params是一个条件类型,它根据传入的泛型类型T是否满足(...args: infer P) => any条件进行分支。如果满足条件,则返回infer P中推断的参数类型P;否则返回never类型。

我们可以使用Params来获取函数sum的参数类型:

type SumParams = Params<typeof sum>; // 类型为 [number, number]

通过使用Paramstypeof操作符,我们成功地从函数sum中获取了参数的类型,即 [number, number]

注:函数参数为元组类型

获取函数参数类型的能力可以帮助我们实现更加灵活和可复用的代码设计。例如,我们可以使用获取的参数类型来进行函数重载、参数验证或者创建更通用的高阶函数。

function validateArgs<T extends any[]>(...args: T): T {
  // 执行参数验证逻辑
  return args;
}

const validatedArgs = validateArgs(1, 2, 3); // 类型为 [number, number, number]

在上述示例中,我们定义了一个validateArgs函数,它接受任意数量的参数,并对参数进行验证。通过使用获取的参数类型T,我们可以在函数内部对参数进行类型安全的操作,然后将参数原样返回。

总结

infer关键字是TypeScript中用于在条件类型中进行类型推断的重要工具。通过使用infer关键字,我们可以根据类型的特性,实现更加灵活和可复用的类型定义。这种类型推断的能力使得TypeScript能够更好地捕获和利用代码中的类型信息,提高开发效率和代码质量。