Что такое условные типы и 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>; // falseinfer
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-типы.