Метод Promise.all позволяет запускать несколько асинхронных операций параллельно и ждать их завершения. В TypeScript типизация этого метода особенно интересна: он возвращает промис, который разрешается в кортеж (tuple) результатов, сохраняя порядок переданных промисов, даже если они завершились в разное время.
Если вы передаете массив [Promise<string>, Promise<number>], то результатом будет тип [string, number]. Это позволяет безопасно использовать деструктуризацию. В этом блоке задач вы научитесь правильно описывать типы для массивов промисов и обрабатывать агрегированный результат. Это важный навык для разработки производительных приложений, где нужно делать несколько запросов к API одновременно.
- Модуль 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 — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Типизация Promise.
- Async/await с типами.
- Promise.all типизация.
- Модуль 28: Практические паттерны
1. Тип результата Promise.all
В данном задании требуется разметить сегменты TypeScript кода, содержащего вызов Promise.all. Определите для каждого выделенного фрагмента, является ли он типом переменной, промисом (объектом Promise), значением (результатом) промиса или оператором (ключевым словом). Это упражнение поможет разобраться в типизации асинхронного кода и понять, как TypeScript определяет тип результата Promise.all.
const {{results~|~t1}}: {{Promise~|~t2}}<[{{string~|~t3}}, {{number~|~t4}}]> = {{await~|~t5}} {{Promise~|~t6}}.{{all~|~t7}}([
{{fetchData()~|~t8}},
{{fetchUser()~|~t9}}
]);2. Заполнение кортежа
В этом задании вам нужно правильно указать типы элементов кортежа, который возвращает функция Promise.all. Имеется два промиса: один разрешается строкой, другой — числом. Дополните код, указав типы для элементов кортежа в дженерике Promise.all, чтобы TypeScript мог корректно вывести тип переменной result.
const promise1 = Promise.resolve('Hello');
const promise2 = Promise.resolve(42);
const result: Promise<[input1S, input2S]> = Promise.all([promise1, promise2]);3. Параллельный запуск
Перед вами строки TypeScript-кода, которые демонстрируют использование Promise.all для параллельного выполнения нескольких промисов. Строки перемешаны. Восстановите правильную последовательность, чтобы получилась корректная асинхронная функция, создающая массив промисов, вызывающая Promise.all, ожидающая результаты с помощью await и возвращающая их сумму. Обратите внимание на типизацию массива промисов и результата.
const sum = results.reduce((a, b) => a + b, 0); Promise.resolve(20), const results = await Promise.all(promises);}async function processParallel(): Promise<number> { const promises: Promise<number>[] = [ return sum; Promise.resolve(10), ];4. Деструктуризация результата
В этом задании вам предстоит заполнить пропуски в коде TypeScript, который использует Promise.all для параллельного выполнения двух промисов с последующей деструктуризацией результата. Вам нужно выбрать из выпадающего списка правильные типы для переменных text и count, чтобы код был типобезопасным и компилировался без ошибок. Обратите внимание на типы исходных промиссов и порядок их разрешения.
async function processData() {
const fetchText: Promise<string> = Promise.resolve('Hello, TypeScript!');
const fetchCount: Promise<number> = Promise.resolve(42);
const [text, count]: [input1S, input2S] = await Promise.all([fetchText, fetchCount]);
console.log(`Text: ${text}, Count: ${count}`);
}5. Массив или Кортеж?
Рассмотрим использование Promise.all в TypeScript. Представьте, что у вас есть массив промисов, возвращающих значения одного типа (например, числа). Проанализируйте, какой тип будет у результата вызова Promise.all для такого массива. Выберите все верные утверждения о типизации результата.
const promises: Promise<number>[] = [
Promise.resolve(1),
Promise.resolve(2),
Promise.resolve(3)
];
const result = Promise.all(promises);
// Какой тип будет у переменной result?6. Ошибка порядка типов
В этом фрагменте TypeScript-кода допущена ошибка типизации при использовании Promise.all. Функция возвращает кортеж с результатами промисов, но порядок типов в аннотации не соответствует фактическому порядку разрешения промисов. Исправьте строку с объявлением переменной, чтобы типы соответствовали возвращаемым значениям промисов.
async function fetchData() { const promise1: Promise<string> = Promise.resolve('success'); const promise2: Promise<number> = Promise.resolve(42); const [result1, result2]: [number, string] = await Promise.all([promise1, promise2]); console.log(result1, result2);}7. Логика работы Promise.all
Проанализируйте TypeScript-код сверху и расставьте шаги снизу в правильном порядке, чтобы получилась логика выполнения программы. В коде используется Promise.all, один из промисов завершается ошибкой. Восстановите хронологию событий: от запуска Promise.all до обработки ошибки в блоке catch.
// Создаем три промиса с разным временем выполнения и результатом
const promise1 = Promise.resolve(42);
const promise2 = new Promise<string>((resolve) => {
setTimeout(() => resolve('done'), 100);
});
const promise3 = Promise.reject(new Error('Something went wrong'));
// Запускаем Promise.all с этими промисами
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log('Results:', results);
})
.catch((error) => {
console.error('Error caught:', error.message);
});