Практическое применение infer: разворачивание обещаний
Разворачивайте типы Promise, Array и пользовательских обёрток
«Практическое применение infer: разворачивание обещаний» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Проблема распаковки
При работе с асинхронным кодом Вы часто получаете Promise, но нуждаетесь во внутреннем типе T. Ключевое слово infer делает это извлечение повторно используемым.
type Awaited<T> = T extends Promise<infer U> ? U : T;
type A = Awaited<Promise<string>>; // string
type B = Awaited<number>; // numberВстроенная утилита Awaited
В TypeScript 4.5 появилась встроенная утилита Awaited, которая рекурсивно обрабатывает вложенные обещания.
type A = Awaited<Promise<Promise<string>>>; // string
// Handles arbitrary nesting automaticallyРаспаковка с заданной глубиной
До появления встроенной утилиты Awaited разработчики использовали рекурсивные типы с infer для распаковки обещаний.
type DeepAwaited<T> =
T extends Promise<infer U> ? DeepAwaited<U> : T;
type A = DeepAwaited<Promise<Promise<number>>>; // numberРаспаковка элементов массива
Тот же шаблон infer извлекает тип элемента из массива, что эквивалентно встроенному подходу T[number].
type Element<T> = T extends (infer U)[] ? U : never;
type A = Element<string[]>; // string
type B = Element<number[]>; // numberРаспаковка типов Observable
Для Observable в RxJS infer извлекает тип испускаемого значения.
type ObservableType<T> = T extends Observable<infer U> ? U : never;
type A = ObservableType<Observable<User>>; // UserРаспаковка возвращаемого значения функции
Сочетайте ReturnType и Awaited, чтобы получить разрешённое значение асинхронной функции.
async function getUser(): Promise<User> { /* ... */ }
type UserResult = Awaited<ReturnType<typeof getUser>>; // UserРаспаковка вложенных оболочек
Можно объединять infer, чтобы обрабатывать типы, обёрнутые в несколько слоёв, например Promise.
type UnwrapPromiseArray<T> =
T extends Promise<infer U>
? U extends (infer V)[]
? V
: U
: T;
type A = UnwrapPromiseArray<Promise<User[]>>; // UserУсловная распаковка по структуре
Используйте infer, чтобы распаковывать только определённые типы, оставляя остальные без изменений.
type MaybeUnwrap<T> =
T extends Promise<infer U> ? U : T extends (infer V)[] ? V : T;
type A = MaybeUnwrap<Promise<string>>; // string
type B = MaybeUnwrap<number[]>; // number
type C = MaybeUnwrap<boolean>; // booleanТипизированная оболочка для получения данных API
Обобщённая оболочка для получения данных, возвращающая разрешённый тип данных, — классический пример применения распаковки на основе infer.
async function fetchData<T>(url: string): Promise<T> {
const res = await fetch(url);
return res.json() as T;
}
type UserData = Awaited<ReturnType<typeof fetchData<User>>>; // UserРаспаковка с безопасной обработкой ошибок
Шаблон Result в сочетании с infer позволяет извлекать тип успешного результата из размеченного объединения.
type Ok<T> = { ok: true; value: T };
type Err = { ok: false; error: string };
type ExtractOk<T> = T extends Ok<infer V> ? V : never;
type A = ExtractOk<Ok<number> | Err>; // numberИтоги: распаковка с помощью infer
Ключевое слово infer — универсальный инструмент для извлечения типов из оболочек: обещаний, массивов, Observable и типов Result. Встроенная утилита Awaited обрабатывает асинхронную распаковку; для других структур используйте собственные типы.
Быстрая проверка
Как лучше всего получить тип разрешённого значения асинхронной функции?
Чему Вы научились
Распаковка на основе infer — практический инструмент для асинхронного кода TypeScript. Используйте встроенную утилиту Awaited для обещаний и создавайте собственные типы распаковки для массивов, Observable и шаблонов Result.
Часто задаваемые вопросы
Урок «Практическое применение infer: разворачивание обещаний» бесплатный?
Да — полный текст урока «Практическое применение infer: разворачивание обещаний» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Практическое применение infer: разворачивание обещаний»?
Разворачивайте типы Promise, Array и пользовательских обёрток Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Практическое применение infer: разворачивание обещаний»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Понимание infer в условных типах
- Создание ReturnType и Parameters с нуля
- Шаблоны вывода во вложенных структурах
- Практическое применение infer: разворачивание обещаний