PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые типы

Что такое infer в TypeScript?

Продвинутые типы

`infer` объявляет переменную типа внутри условного типа: TypeScript сам выводит её значение из сопоставления с шаблоном.

Примеры

type ElementType<T> = T extends (infer U)[] ? U : never;
type A = ElementType<string[]>; // string

type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type B = MyReturnType<() => number>; // number

type Unwrap<T> = T extends Promise<infer V> ? V : T;
type C = Unwrap<Promise<User>>; // User

Где используют

  • встроенные типы ReturnType, Parameters, Awaited, InstanceType построены на infer;
  • разбор строковых шаблонов:
type Param<S> = S extends `${string}:${infer Name}/${string}` ? Name : never;
type D = Param<'/users/:id/posts'>; // 'id'
  • извлечение частей типов библиотек (props компонента, payload экшена).

Ограничения

infer работает только внутри extends условного типа; можно ограничить выводимый тип: infer U extends string.

Коротко для собеседования

infer вводит переменную типа в условном типе и выводит её из сопоставления — так извлекают тип элемента массива, результата функции, значения промиса или части строки.

Подробнее: TypeScript Handbook — Inferring Within Conditional Types

Другие вопросы раздела