Использовал ли generic вместе с infer в TypeScript?

«Использовал ли generic вместе с infer в TypeScript?» — вопрос из категории TypeScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, использовал. В TypeScript infer внутри условных типов позволяет вывести тип из другого типа, что особенно полезно при создании утилитарных типов для работы с промисами, функциями или структурами данных в Node.js.

Пример извлечения типа из Promise:

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

type StringResult = UnwrapPromise<Promise<string>>; // string
type NumberResult = UnwrapPromise<number>; // number

Практическое применение в Node.js: Часто использую это для типизации результатов асинхронных операций, например, при работе с async/await или библиотеками вроде Prisma:

type ExtractQueryResult<T> = T extends (...args: any[]) => Promise<infer U> ? U : never;

// Для функции, возвращающей промис с пользователем
type User = ExtractQueryResult<typeof getUserById>;

infer также лежит в основе встроенных утилит TypeScript, таких как ReturnType и Parameters, которые я применяю для улучшения типизации в Express-роутах или сервисных слоях.