Async/await с типами

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

Тренажер по TypeScript

Асинхронность — важнейшая часть современного веба. В этом уроке мы научимся правильно типизировать async/await в TypeScript. Вы узнаете, почему любая асинхронная функция возвращает Promise<T>, и как правильно указывать типы возвращаемых значений.

Мы разберем:

  • Синтаксис async function и типизацию результата.
  • Как TypeScript понимает тип переменной после await.
  • Обработку ошибок в асинхронном коде.

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

Список тем

1. Типизация Promise

id: 40769_async_01_ret

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

Заполните пропуски
async function greet(): input1S<input2S> {
    return "Hello, World!";
}

greet().then(console.log);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Где Promise?

id: 40769_async_02_click

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

Кликните по всем фрагментам, которые подходят под условие задания.
// Пример кода с асинхронными функциями
async function {{getData~|~t1}}() { return await fetch('/data'); }
function {{syncFunc~|~t4}}() { return 42; }
const {{asyncArrow~|~t2}} = async () => { console.log('loading'); };
function {{returnsPromise~|~t3}}(): Promise { return Promise.resolve(); }
const {{notAsync~|~t5}} = () => 'hello';
{{getData~|~t6}}().then(console.log);
{{syncFunc~|~t7}}();
{{asyncArrow~|~t8}}();
{{returnsPromise~|~t9}}().then(() => {});
{{notAsync~|~t10}}();
Сообщения
Проверить
Показать подсказку

3. Развернутые типы

id: 40769_async_03_sort

В асинхронных функциях TypeScript переменные до использования оператора await имеют тип Promise, а после await — тип T (развернутое значение). Перед вами шесть фрагментов кода, представляющих объявления переменных в асинхронном контексте. Распределите их по двум категориям: «До await» (тип Promise) и «После await» (развернутый тип). Обратите внимание на тип переменной в каждом объявлении.

Перетяните элементы в соответствующие блоки
До await
После await
const user: Promise<User> = fetchUser();
const user: User = await fetchUser();
const count: Promise<number> = getCount();
const count: number = await getCount();
const isActive: Promise<boolean> = checkStatus();
const isActive: boolean = await checkStatus();
Сообщения
Проверить
Показать подсказку

4. Асинхронный запрос

id: 40769_async_04_build

Из предложенных строк соберите корректную TypeScript-функцию, которая асинхронно получает данные с удалённого сервера, парсит JSON и возвращает типизированный объект. Функция должна использовать async/await, проверять статус ответа и возвращать данные с определённым типом. Некоторые строки лишние и не должны входить в решение.

Перетяните в правильном порядке строки из одного блока в другой
type Todo = { id: number; title: string };
async function fetchData(): Promise<Todo> {
  const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
  if (!response.ok) throw new Error('Network response was not ok');
  const data = await response.json();
  return data;
}
  console.log(data);
  const data = response.json();
  return response;
async function fetchData() {
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Порядок выполнения

id: 40769_async_05_analyze

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

async function fetchData(id: number): Promise<string> {
  return new Promise(resolve => {
    setTimeout(() => resolve(`Data ${id}`), 100);
  });
}

async function process() {
  console.log('Старт функции process');
  const result1 = await fetchData(1);
  console.log(result1);
  const result2 = await fetchData(2);
  console.log(result2);
  console.log('Завершение функции process');
}

// Явный вызов функции с входными данными
process();
Расположите элементы в логичном порядке
Возобновление функции process, присвоение результата переменной result2 и вывод 'Data 2' в консоль
Синхронное выполнение: вывод 'Старт функции process' в консоль
Возобновление функции process, присвоение результата переменной result1 и вывод 'Data 1' в консоль
Выполнение промиса fetchData(1): задержка 100 мс, затем разрешение со значением 'Data 1'
Выполнение промиса fetchData(2): задержка 100 мс, затем разрешение со значением 'Data 2'
Синхронное выполнение: вывод 'Завершение функции process' в консоль
Приостановка выполнения функции process на втором await, запуск промиса fetchData(2)
Приостановка выполнения функции process на первом await, запуск промиса fetchData(1)
Сообщения
Проверить
Показать подсказку

6. Забытый await

id: 40769_async_07_error

В этом фрагменте TypeScript-кода допущена ошибка: при вызове асинхронной функции забыли использовать оператор `await`. Из-за этого переменная получает значение типа `Promise` вместо `string`, и последующий вызов метода `.length` приводит к ошибке типов. Исправьте строку с вызовом асинхронной функции, добавив `await` перед вызовом.

Найдите ошибку и исправьте
async function fetchData(): Promise<string> {
    return "Hello, TypeScript!";
}
 
async function process() {
    const data = fetchData(); // Ошибка: забыт await
    console.log(data.length);
}
 
process();
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Тип результата

id: 40769_async_08_res

Рассмотрите фрагмент TypeScript-кода, в котором объявлена асинхронная функция, возвращающая Promise. Определите, какой тип будет у переменной x после выполнения операции await. Введите название типа в поле ответа (одно слово, в нижнем регистре).

Что должно получиться?
async function getNum(): Promise<number> {
    return 42;
}

async function main() {
    const x = await getNum();
    // Какой тип у переменной x?
}

main();
Сообщения
Проверить
Показать подсказку

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

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