0Pricing
TypeScript Academy · Урок

Практическое применение 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 — локальная установка не требуется.

Все уроки этого курса

  1. Понимание infer в условных типах
  2. Создание ReturnType и Parameters с нуля
  3. Шаблоны вывода во вложенных структурах
  4. Практическое применение infer: разворачивание обещаний
← Назад к TypeScript Academy