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?
-
Упрощение работы с асинхронными функциями
Awaited позволяет явно указать тип результата, полученного после ожидания промиса, что упрощает типизацию и уменьшает дублирование. -
Рекурсивное извлечение типов
При работе с вложенными промисами Awaited автоматически «распаковывает» вложенные типы, возвращая конечное значение. -
Поддержка асинхронных утилит
Awaited полезен при построении обобщённых утилит для работы с асинхронным кодом, где важно знать точный тип данных после разрешения промиса.
Ограничения
- Если тип
T
не является промисом, Awaited просто возвращаетT
без изменений. - В случае сложных условных типов или обобщённых функций, может потребоваться более тщательное описание типов для корректного вывода.
Итог
Awaited — мощный утилитный тип, который позволяет автоматически извлекать тип значений из промисов. Он особенно полезен для асинхронного программирования в TypeScript, обеспечивая точную типизацию возвращаемых данных и упрощая работу с вложенными промисами.