infer используется внутри conditional type для захвата (извлечения) типа из другого типа в новую переменную типа, которую вы затем можете использовать. Это сопоставление шаблонов для типов.
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
infer используется внутри conditional type для захвата (извлечения) типа из другого типа в новую переменную типа, которую вы затем можете использовать. Это сопоставление шаблонов для типов.
<T> = T (infer U)[] ? U : ;
A = <[]>;
B = <[]>;
Читайте так: "если T совпадает с шаблоном U[], свяжите U с любым типом элемента и верните его." infer U объявляет заполнитель, который компилятор заполняет сопоставлением шаблонов.
// the resolved type of a Promise
type Awaited2<T> = T extends Promise<infer R> ? R : T;
type R = Awaited2<Promise<User>>; // User
// a function's return type (this is how ReturnType is built)
type MyReturn<T> = T extends (...args: any[]) => infer R ? R : never;
type X = MyReturn<() => number>; // number
// a function's first parameter
type FirstArg<T> = T extends (a: infer A, ...rest: any[]) => any ? A : never;
type UnwrapBoth<T> =
T extends Promise<infer U> ? UnwrapBoth<U> : // recurse to unwrap nested promises
T extends (infer E)[] ? E : T;
Вы можете использовать несколько infer в одном шаблоне и даже рекурсию.
infer — это основа встроенных типов таких как ReturnType, Parameters, Awaited и InstanceType, а также магии библиотек, которая выводит типы ответов из fetcher-ов или props из компонентов.
Оно позволяет коду типов "открывать" сложный тип и извлекать внутренние части — самый мощный инструмент для написания типов, которые адаптируются к другим типам.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать