好的,我帮你整理一个 TypeScript 中 infer 关键字的使用小结,并附上典型示例,方便快速掌握。


TypeScript infer 关键字小结

infer 是 TypeScript 条件类型中用来 推断类型变量 的关键字,它只能在 extends 子句的条件类型中使用。主要用途是从复杂类型中提取或推导出子类型。


1️⃣ 基本语法

type Conditional<T> = T extends SomeType<infer U> ? U : OtherType;

解释:

  • 如果 T 可以赋值给 SomeType<...>,就把 ... 推断为 U
  • 否则返回 OtherType

2️⃣ 常见用法示例

(1)提取数组元素类型

type ElementType&lt;T> = T extends (infer U)[] ? U : T;

type A = ElementType&lt;number[]>; // number
type B = ElementType&lt;string>;   // string

  • 说明:infer U 推断数组元素类型。

(2)提取函数返回值类型

type ReturnType&lt;T> = T extends (...args: any[]) => infer R ? R : any;

type Func = (x: number, y: number) => string;

type R = ReturnType&lt;Func>; // string

  • infer R 推断函数返回值类型。

(3)提取函数参数类型

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

type Func = (x: number, y: string) => boolean;

type P = Params&lt;Func>; // [number, string]

  • infer P 推断函数参数的元组类型。

(4)提取 Promise 内部类型

type UnwrapPromise&lt;T> = T extends Promise&lt;infer U> ? U : T;

type P1 = UnwrapPromise&lt;Promise&lt;number>>; // number
type P2 = UnwrapPromise&lt;string>;           // string

  • infer U 提取 Promise 的 resolve 类型。

(5)递归类型推断

可以用 infer 做递归类型提取:

type DeepArrayElement&lt;T> = T extends (infer U)[]
  ? DeepArrayElement&lt;U>
  : T;

type Arr = number[][][]; 
type E = DeepArrayElement&lt;Arr>; // number

  • 可以从多维数组中提取最内层类型。

3️⃣ 使用小技巧

  1. infer 只能在条件类型中使用type T = infer X; // ❌ 错误,必须在 extends 中
  2. 可搭配 any[] 或函数类型解构
    • 数组:T extends (infer U)[]
    • 函数:T extends (...args: infer P) => any
  3. 可以用于解构对象类型(结合映射类型和条件类型):type GetValueType<T> = T extends { value: infer V } ? V : never; type Obj = { value: string }; type V = GetValueType<Obj>; // string
  4. 可用于高级工具类型组合
    • ReturnType<T>
    • Parameters<T>
    • Awaited<T>(TS 内置从 Promise 解包)

✅ 总结:

  • infer条件类型中提取子类型的利器
  • 常用场景:
    1. 提取数组、Promise、函数参数、返回值类型。
    2. 做递归类型计算。
    3. 结合对象类型提取字段类型。
  • 不能单独使用,必须在 extends 中出现。