Типизация fetch запросов

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

Тренажер по TypeScript

Работа с сетью через fetch — стандартная задача веб-разработки. Однако стандартный метод response.json() возвращает тип Promise<any>, что сводит на нет безопасность типов TypeScript. Вы не получаете автодополнения и не видите ошибок, если обращаетесь к несуществующему полю.

Чтобы типизировать ответ, мы используем интерфейсы и дженерики (Generics). Это позволяет явно указать, какую структуру данных мы ожидаем от сервера.

Пример:

interface User {
  id: number;
  name: string;
}
// ...
const data = await res.json() as User;

В этом практическом уроке вы научитесь создавать интерфейсы для API-ответов, использовать as утверждения и писать типизированные обертки над fetch запросами.

Список тем

1. Приведение типа ответа

id: 40773_fetch_01_interface

В этом задании вам нужно типизировать ответ от API, используя оператор приведения типа в TypeScript. Дан код, который выполняет fetch-запрос для получения данных о пользователе. Интерфейс UserData уже объявлен. Вам необходимо добавить приведение типа к интерфейсу UserData для переменной data, чтобы TypeScript знал структуру полученного объекта. Заполните пропуск в коде, чтобы он компилировался и корректно выводил имя пользователя.

Заполните пропуски
interface UserData { name: string; age: number; }

async function fetchUserData() {
  const response = await fetch('https://api.example.com/user');
  const data = await response.json() input1S;
  console.log(data.name);
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Функция-обертка

id: 40773_fetch_02_generic

Из предложенных строк соберите generic-функцию `request`, которая делает fetch-запрос по переданному URL и возвращает Promise с данными в формате JSON. Функция должна быть асинхронной и использовать generic-тип для указания типа возвращаемых данных. Лишние строки в решение включать не нужно.

Перетяните в правильном порядке строки из одного блока в другой
async function request<T>(url: string): Promise<T> {
    const response = await fetch(url);
    return response.json();
}
function request(url: string): Promise<any> {
    const data = await response.json();
    return response;
async function request<T>(url: string, method: string): Promise<T> {
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Соответствие полей

id: 40773_fetch_03_fields

Перед вами фрагмент кода TypeScript, содержащий интерфейс, описывающий структуру ответа от сервера, и функцию обработки этого ответа. Внимательно изучите код. Ваша задача — кликнуть и выделить все обращения к свойствам объекта `data` внутри функции `processResponse`, которые действительно существуют в интерфейсе `ApiResponse`. Не отмечайте сам объект `data`, названия методов, другие переменные или свойства, которые не описаны в интерфейсе.

Кликните по всем фрагментам, которые подходят под условие задания.
interface ApiResponse {
  id: number;
  title: string;
  tags: string[];
}

async function processResponse(response: Response) {
  const data: ApiResponse = await response.json();
  
  console.log('ID:', {{data~|~t0}}.{{id~|~t1}});
  console.log('Title:', {{data~|~t2}}.{{title~|~t3}});
  console.log('Tags count:', {{data~|~t4}}.{{tags~|~t5}}.length);
  
  // Это свойство отсутствует в интерфейсе
  console.log('Description:', {{data~|~t6}}.{{description~|~t7}});
}
Сообщения
Проверить
Показать подсказку

4. Порядок обработки запроса

id: 40773_fetch_04_flow

В этом задании вам нужно восстановить правильный порядок строк кода TypeScript, которые выполняют асинхронный запрос с использованием fetch. Код включает вызов fetch, ожидание ответа, преобразование в JSON, приведение типа к определенному интерфейсу и использование типизированных данных. Расставьте строки в таком порядке, чтобы они корректно обрабатывали запрос и типизацию данных, учитывая, что переменные должны быть объявлены до их использования.

Расставьте строки в правильном порядке
console.log(typedData);
const promise = fetch('https://api.example.com/data');
const data = await response.json();
const response = await promise;
const typedData = data as UserData;
Сообщения
Проверить
Показать подсказку

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

id: 40773_fetch_05_predict

Проанализируйте представленный код TypeScript с использованием fetch API. Определите, какой тип данных будет возвращён при вызове асинхронной функции getUser(). Обратите внимание на сигнатуру функции и обработку ответа.

Выберите правильный вариант ответа
interface User {
  id: number;
  name: string;
  email: string;
}

async function getUser(): Promise<User> {
  const response = await fetch('https://api.example.com/user/1');
  const data = await response.json();
  return data as User;
}
Сообщения
Проверить
Показать подсказку

6. Ошибка в имени свойства

id: 40773_fetch_06_mistake

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

Найдите ошибку и исправьте
interface UserData {
  id: number;
  fullName: string;
  email: string;
}
 
async function fetchUser(): Promise<void> {
  const response = await fetch('https://api.example.com/user/1');
  const user: UserData = await response.json();
  console.log(user.fullname); // Опечатка в имени свойства
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

7. Передача типа в функцию

id: 40773_fetch_07_generic_arg

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

Нужно правильно расставить в пропуски предложенные варианты
interface User {
  id: number;
  name: string;
}

async function fetchUser() {
  const response = await http.get<input1S>('https://api.example.com/user/1');
  const user = response.data;
  console.log(user.name);
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Анализ асинхронности

id: 40773_fetch_08_analyze

Проанализируйте typescript-код сверху и расставьте шаги снизу в правильном порядке, чтобы получилась логика выполнения асинхронной функции с обработкой ошибок сети и HTTP-статусов. Обратите внимание на последовательность действий внутри try/catch блока при выполнении fetch запроса и обработке возможных ошибок.

async function fetchUserData(userId: number): Promise<any> {
    const url = `https://api.example.com/users/${userId}`;
    
    try {
        const response = await fetch(url);
        
        if (!response.ok) {
            throw new Error(`HTTP error! Status: ${response.status}`);
        }
        
        const data = await response.json();
        console.log('Данные получены:', data);
        return data;
    } catch (error) {
        console.error('Ошибка при выполнении запроса:', error);
        return null;
    }
}

// Вызов функции с конкретным параметром
const result = fetchUserData(42);
Расположите элементы в логичном порядке
Задаётся URL для запроса с конкретным параметром userId
Ожидание преобразования ответа в JSON (парсинг данных)
Начало выполнения асинхронной функции и блока try
Ожидание выполнения fetch запроса по указанному URL
Блок catch: обработка и вывод ошибки в консоль (при сбое сети или ошибке HTTP)
Вывод полученных данных в консоль (в случае успешного выполнения)
Проверка свойства response.ok: если false, выбрасывается ошибка с кодом статуса
Сообщения
Проверить
Показать подсказку

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

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