PassFront
  1. PassFront
  2. База знаний
  3. Дженерики

Что такое условные типы и infer в TypeScript?

Дженерики

Условный тип выбирает один из двух типов в зависимости от проверки: T extends U ? X : Y. Ключевое слово `infer` позволяет вытащить часть типа в процессе проверки.

Условные типы

type IsString<T> = T extends string ? true : false;

type A = IsString<'x'>;  // true
type B = IsString<number>; // false

infer

type ReturnOf<T> = T extends (...args: any[]) => infer R ? R : never;

type R1 = ReturnOf<() => number>;           // number
type R2 = ReturnOf<(a: string) => string[]>; // string[]

type ElementOf<T> = T extends (infer U)[] ? U : never;
type E = ElementOf<number[]>; // number

Так устроены стандартные ReturnType, Parameters и Awaited.

Распределение по union

Для «голого» параметра условный тип применяется к каждому члену объединения отдельно:

type ToArray<T> = T extends unknown ? T[] : never;
type X = ToArray<string | number>; // string[] | number[]

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

Условные типы — if на уровне типов, infer извлекает вложенный тип. На них построены многие встроенные utility-типы.

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