Весной стартует сезон найма, успей отхватить свой оффер!

Utility Type Awaited в TypeScript

Awaited — это утилитный тип в TypeScript, введённый в версии 4.5, который извлекает значение из Promise. Если функция или переменная возвращает Promise<T>, то Awaited<T> выдаст сам T.


Синтаксис

Awaited<T>
  • T — тип, который может быть промисом или значением.
  • Если T является промисом (Promise<U>), то Awaited<T> возвращает тип U.
  • Если T — не промис, то Awaited<T> возвращает сам T.

Пример использования

Пример 1. Достаём значение из промиса

async function getData(): Promise<number> {
  return 42;
}

type DataType = Awaited<ReturnType<typeof getData>>;
// DataType → number

В этом примере:

  • Функция fetchData возвращает Promise<number>.
  • ReturnType<typeof fetchData> извлекает тип возвращаемого значения функции, т.е. Promise<number>.
  • Awaited<Promise<number>> распаковывает промис, возвращая тип number.

Пример 2. Работа с вложенными промисами

type NestedPromise = Promise<Promise<string>>;

type Result = Awaited<NestedPromise>;
// Result → string
  • Если промисов несколько, Awaited распаковывает их до конечного значения.

Зачем использовать Awaited?

  1. Упрощение работы с асинхронными функциями
    Awaited позволяет явно указать тип результата, полученного после ожидания промиса, что упрощает типизацию и уменьшает дублирование.

  2. Рекурсивное извлечение типов
    При работе с вложенными промисами Awaited автоматически «распаковывает» вложенные типы, возвращая конечное значение.

  3. Поддержка асинхронных утилит
    Awaited полезен при построении обобщённых утилит для работы с асинхронным кодом, где важно знать точный тип данных после разрешения промиса.


Ограничения

  • Если тип T не является промисом, Awaited просто возвращает T без изменений.
  • В случае сложных условных типов или обобщённых функций, может потребоваться более тщательное описание типов для корректного вывода.

Итог

Awaited — мощный утилитный тип, который позволяет автоматически извлекать тип значений из промисов. Он особенно полезен для асинхронного программирования в TypeScript, обеспечивая точную типизацию возвращаемых данных и упрощая работу с вложенными промисами.