Типизация Promise

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

В современной веб-разработке работа с асинхронными операциями — это стандарт. В TypeScript типизация Promise играет ключевую роль, позволяя нам точно знать, какие данные вернутся после завершения операции. Основной синтаксис использует обобщения (generics): Promise, где T — это тип данных, которые промис вернет в случае успеха (resolve).

Если вы создаете асинхронную функцию с async, TypeScript часто может автоматически вывести тип возвращаемого значения, оборачивая его в Promise. Однако явное указание типа, например async function getData(): Promise, делает код более читаемым и защищенным от ошибок. В этом уроке мы разберем, как правильно указывать типы для промисов, как типизировать возвращаемые значения асинхронных функций и работать с результатами выполнения.

Используйте этот тренажер, чтобы закрепить навыки написания безопасного асинхронного кода.

Список тем

1. Базовый синтаксис Promise

id: 40768_ts_promise_01_syntax

В этом задании вы работаете с типизацией Promise в TypeScript. Дан код создания нового промиса, который разрешается с числом. Необходимо указать правильный тип в дженерике Promise, чтобы код был типобезопасным и корректно компилировался. Заполните пропуск в дженерике, указав тип значения, с которым промис будет разрешен.

Заполните пропуски
const myPromise = new Promise<input1S>((resolve) => {
    resolve(42);
});
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Возвращаемый тип async функции

id: 40768_ts_promise_02_async_return

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

Нужно правильно расставить в пропуски предложенные варианты
async function fetchMessage(): input1S {
    return 'Hello, TypeScript!';
}

// Вызов функции
const message = await fetchMessage();
console.log(message);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Несоответствие типов

id: 40768_ts_promise_03_error_fix

В данном фрагменте TypeScript кода объявлен Promise с дженериком, указывающим на числовой тип, однако в функции resolve передается строковое значение, что приводит к несоответствию типов. Найдите и исправьте ошибку в строке с вызовом resolve, чтобы Promise разрешался с правильным типом, и код мог выполниться без ошибок, выводя отформатированное число в консоль.

Найдите ошибку и исправьте
const promise = new Promise<number>((resolve) => {
    resolve("hello");
});
 
promise.then((value) => {
    console.log(value.toFixed(2));
});
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Где указан тип данных?

id: 40768_ts_promise_04_identify_generic

В данном фрагменте кода TypeScript создаётся и используется Promise. Ваша задача — выделить часть кода, которая указывает тип данных, возвращаемых этим Promise (generic-параметр). Обратите внимание, что generic-параметр указывается в угловых скобках после ключевого слова Promise. Выберите для выделенного сегмента тип 'Generic-параметр' из предложенных вариантов.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
const fetchData = (): Promise<{{string~|~t1}}> => {
  return new Promise((resolve) => {
    setTimeout(() => resolve('Данные загружены'), 1000);
  });
};

fetchData().then((result) => console.log(result));
Тип данных
Generic-параметр
Ключевое слово
Строковый литерал
Сообщения
Проверить
Показать подсказку

5. Результат вызова без await

id: 40768_ts_promise_05_predict

Проанализируйте фрагмент кода на TypeScript, в котором вызывается асинхронная функция без использования оператора await. Определите, какое значение будет храниться в переменной после выполнения этого кода. Обратите внимание на типы и поведение Promise в TypeScript.

Выберите правильный вариант ответа
async function fetchData(): Promise<string> {
    return 'Данные загружены';
}

const result = fetchData();
// Что находится в переменной result?
Сообщения
Проверить
Показать подсказку

6. Сборка асинхронной функции

id: 40768_ts_promise_06_build

Из предложенных строк соберите корректную асинхронную функцию на TypeScript, которая возвращает Promise со значением true. Функция должна быть объявлена с использованием ключевого слова async, иметь явную аннотацию типа возвращаемого значения Promise и содержать только оператор return true. Лишние строки (не относящиеся к решению) не включайте в итоговую последовательность.

Перетяните в правильном порядке строки из одного блока в другой
async function check(): Promise<boolean> {
    return true;
}
console.log('Hello');
let x = 5;
return false;
async function another() {}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Порядок выполнения промиса

id: 40768_ts_promise_07_result_flow

Проанализируйте TypeScript-код сверху и восстановите последовательность логических шагов выполнения программы. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как программа создаёт и обрабатывает Promise, включая асинхронную операцию и вывод результата.

function asyncDouble(x: number): Promise<number> {
  return new Promise((resolve) => {
    console.log('Начало асинхронной операции');
    setTimeout(() => {
      resolve(x * 2);
    }, 1000);
  });
}

asyncDouble(5).then((result) => {
  console.log(`Результат: ${result}`);
});
Расположите элементы в логичном порядке
Вызов функции asyncDouble с аргументом 5
Запуск таймера на 1 секунду (асинхронная операция)
Создание нового Promise: функция-исполнитель (executor) запускается синхронно
Выполнение колбэка в .then: вывод 'Результат: 10' в консоль
Вывод 'Начало асинхронной операции' в консоль (внутри executor)
После срабатывания таймера вызывается resolve с результатом 10
Сообщения
Проверить
Показать подсказку

8. Цепочка промисов

id: 40768_ts_promise_08_calc

Рассмотрите фрагмент кода на TypeScript, в котором создаётся Promise с начальным числовым значением, а затем выполняется цепочка асинхронных операций с использованием .then(). Каждое звено цепочки изменяет значение (умножает или складывает). Определите, какое число будет выведено в консоль после выполнения всей цепочки промисов. Введите только одно число без дополнительных символов, пробелов или текста.

Что должно получиться?
const initialPromise: Promise<number> = Promise.resolve(5);

initialPromise
  .then((value: number) => value * 2)
  .then((value: number) => value + 10)
  .then((value: number) => value - 3)
  .then((result: number) => {
    console.log(result);
  });
Сообщения
Проверить
Показать подсказку

TypeScript: компиляция и запуск

id: 40768_compiler
TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру