Utility Type Awaited извлекает тип значения, на которое разрешается (resolves) переданный тип T. Тип T может быть Promise, Promise (вложенные промисы) или даже не промисом — в последнем случае Awaited просто вернёт T.
Этот тип крайне полезен для аннотирования возвращаемых значений асинхронных функций, особенно когда есть цепочки вызовов или необходимость "распаковать" вложенные промисы. Синтаксис: type Result = Awaited.
Освоить Awaited на практике — значит писать более чистые типы в современной асинхронной разработке на TypeScript. Наш онлайн-тренажер предлагает задания для тренировки этой темы.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- ReturnType.
- Parameters.
- Awaited.
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Что вернёт Awaited?
В этом задании вам нужно определить, какой тип возвращает утилитарный тип TypeScript Awaited
type T1 = Awaited<Promise<number>>; // input1S
type T2 = Awaited<number>; // input2S
type T3 = Awaited<Promise<Promise<string>>>; // input3S
type T4 = Awaited<Promise<Promise<Promise<boolean>>>>; // input4S2. Разметь цепочку типов
Внимательно изучите данный фрагмент кода TypeScript и разметьте выделенные сегменты, выбрав для каждого его роль из предложенных категорий. Вам нужно определить, что является исходным типом, что является Utility Type (в данном случае Awaited), что является результирующим типом после применения Awaited, а также выделить ключевое слово. Это упражнение поможет лучше понять, как работает Utility Type Awaited для "распаковки" типов промисов.
type OriginalType = {{Promise~|~t1}}<{{number~|~t2}}>;
type UnwrappedType = {{Awaited~|~t3}}<{{Promise~|~t4}}<{{number~|~t5}}>>;3. Простая распаковка
Рассмотрите приведённый код на TypeScript, в котором используется утилитный тип Awaited для раскрытия вложенного промиса. Определите, какой тип будет присвоен псевдониму Test. Введите название типа в поле ответа. Обратите внимание, что Awaited рекурсивно раскрывает Promise до его внутреннего типа.
type Test = Awaited<Promise<Promise<number>>>;4. Порядок \"распаковки\"
Перед вами перемешанные шаги, описывающие процесс рекурсивного извлечения типа из Promise
5. Тип после цепочки вызовов
Проанализируйте приведённый код на TypeScript. В нём определены две асинхронные функции: fetchUser, возвращающая объект с полями name и age, и getUserAge, которая использует fetchUser и возвращает Promise, обёрнутый в Promise. Затем с помощью Utility Type Awaited и ReturnType определяется тип AgeType. Выберите, какой из предложенных типов будет у AgeType.
async function fetchUser(): Promise<{ name: string; age: number }> {
return { name: "Alice", age: 30 };
}
async function getUserAge(): Promise<Promise<number>> {
const user = await fetchUser();
return Promise.resolve(user.age);
}
type AgeType = Awaited<ReturnType<typeof getUserAge>>;6. Исправь аннотацию
В данном фрагменте TypeScript кода есть ошибка в аннотации типа переменной, которая получает результат асинхронной функции. Переменная аннотирована как Promise, но после await она должна иметь тип значения внутри Promise. Исправьте ошибку, используя utility type Awaited, чтобы код стал корректным и тип переменной соответствовал фактическому значению.
async function fetchData(): Promise<string> { return "Hello";} async function main() { const data: Promise<string> = await fetchData(); console.log(data);}7. Распредели по группам
Перед вами список выражений с использованием utility типа `Awaited` в TypeScript. Распределите их по категориям в зависимости от типа, который получится в результате вычисления `Awaited`. Обратите внимание, что `Awaited` рекурсивно разворачивает Promise, а для непромисов возвращает переданный тип. Каждый элемент должен оказаться в одной из трёх категорий: «Результат — string», «Результат — number» или «Результат — boolean».
Awaited<Promise<string>>Awaited<string>Awaited<Promise<Promise<string>>>Awaited<Promise<number>>Awaited<number>Awaited<Promise<Promise<number>>>Awaited<Promise<boolean>>Awaited<boolean>Awaited<Promise<Promise<boolean>>>