前置知识: TypeScript

类型推断infer扩展

1 minAdvanced2026/6/14

infer在各类场景中的应用

1. 函数型推断

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type Parameters<T> = T extends (...args: infer P) => any ? P : never;
type FirstParameter<T> = T extends (first: infer F, ...rest: any[]) => any ? F : never;
type LastParameter<T> = T extends (...args: [...any[], infer L]) => any ? L : never;

2. Promise 推断

type Awaited<T> = T extends Promise<infer U> ? Awaited<U> : T;

type Deep = Promise<Promise<Promise<number>>>;
type Result = Awaited<Deep>; // number

3. 数组/元组推断

type Head<T extends any[]> = T extends [infer H, ...any[]] ? H : never;
type Tail<T extends any[]> = T extends [any, ...infer R] ? R : never;
type Last<T extends any[]> = T extends [...any[], infer L] ? L : never;
type ElementOf<T> = T extends (infer E)[] ? E : never;

4. 字符串推断

type TrimLeft<S extends string> = S extends ` ${infer Rest}` ? TrimLeft<Rest> : S;
type TrimRight<S extends string> = S extends `${infer Rest} ` ? TrimRight<Rest> : S;
type Trim<S> = TrimLeft<TrimRight<S>>;

type Split<S extends string, D extends string> = S extends `${infer Head}${D}${infer Tail}`
  ? [Head, ...Split<Tail, D>]
  : [S];

type Join<T extends string[], D extends string> = T extends [
  infer Head extends string,
  ...infer Rest extends string[],
]
  ? Rest extends []
    ? Head
    : `${Head}${D}${Join<Rest, D>}`
  : '';

5. 对象型推断

type PickByValue<T, V> = { [K in keyof T as T[K] extends V ? K : never]: T[K] };
type OmitByValue<T, V> = { [K in keyof T as T[K] extends V ? never : K]: T[K] };