Типизация JSON данных

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

Тренажер по TypeScript

При получении данных из внешних источников (API, LocalStorage) мы часто используем JSON.parse(). Проблема в том, что этот метод возвращает тип any, отключая проверки TypeScript.

Чтобы работать с такими данными безопасно, необходимо явно указывать ожидаемую структуру. Мы можем использовать приведение типов (assertion) as SomeInterface или дженерики в функциях-обертках.

В этом уроке мы попрактикуемся в создании интерфейсов для JSON-ответов и безопасном преобразовании строки в типизированный объект.

Список тем

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

id: 40774_ts_json_replace_assertion

В этом задании вы практикуете приведение типов в TypeScript при работе с JSON данными. Дан фрагмент кода, который определяет интерфейс для данных пользователя и парсит JSON строку. Однако, результат метода JSON.parse() по умолчанию имеет тип 'any', что может привести к ошибкам типизации при обращении к свойствам объекта. Ваша задача — дополнить вызов JSON.parse() оператором приведения типа и указать интерфейс, чтобы TypeScript знал ожидаемую структуру данных. Заполните пропуски в коде, чтобы обеспечить корректную типизацию без изменения логики программы.

Заполните пропуски
// Интерфейс для данных пользователя
interface UserData { name: string; age: number; }

const jsonString = '{"name": "Alice", "age": 30}';
const data = JSON.parse(jsonString) input1S input2S;
console.log(data.name);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Интерфейс под JSON

id: 40774_ts_json_build_interface_match

Из предложенных строк соберите корректный TypeScript интерфейс, который соответствует JSON объекту '{"id": 1, "active": true}'. Интерфейс должен быть назван Config и включать свойства с правильными типами, основанными на значениях JSON. Не включайте лишние строки, которые добавляют свойства, не присутствующие в JSON, или неверные типы.

Перетяните в правильном порядке строки из одного блока в другой
interface Config {
    id: number;
    active: boolean;
}
    name: string;
    id: string;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

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

id: 40774_ts_json_sort_types

Перед вами список строк, представляющих значения в формате JSON. Ваша задача — распределить каждую строку по одной из трёх категорий типов TypeScript: 'number', 'string' или 'boolean'. Обратите внимание, что в JSON числа записываются без кавычек, строки — в двойных кавычках, а логические значения — как true или false без кавычек. Классифицируйте элементы, исходя из того, к какому типу TypeScript они относятся при парсинге JSON.

Перетяните элементы в соответствующие блоки
Числа (number)
Строки (string)
Логические значения (boolean)
"123"
true
42
"hello"
"world"
false
100
"true"
Сообщения
Проверить
Показать подсказку

4. Несоответствие данных

id: 40774_ts_json_error_mismatch

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

Найдите ошибку и исправьте
interface Person {
  name: string;
  age: number;
}
 
const jsonString = '{"name": "Alice", "age": "25"}';
const person: Person = JSON.parse(jsonString);
console.log(person.age);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Процесс парсинга

id: 40774_ts_json_sequencing_flow

В этом упражнении по TypeScript вам предстоит восстановить правильную последовательность этапов процесса парсинга JSON данных. Цель — понять, как из строки JSON получить типизированный объект для безопасного использования в коде. Перед вами четыре описания шагов, которые перемешаны. Ваша задача — расставить их в логическом порядке, отражающем стандартный процесс: от получения сырой строки до работы с типизированными данными. Это поможет закрепить понимание типизации при работе с внешними данными.

Расставьте строки в правильном порядке
Использование типизированных полей
Получение JSON строки
Приведение к интерфейсу (as T)
Парсинг через JSON.parse() (any)
Сообщения
Проверить
Показать подсказку

6. Дженерик парсер

id: 40774_ts_json_select_generic

В этом задании вам предстоит работать с дженерик-функцией `parseJSON`, которая парсит JSON-строку и возвращает типизированный объект. Ваша задача — правильно вызвать эту функцию, передав в качестве дженерик-параметра тип `User`, который определен в коде. Выберите правильный синтаксис для указания типа из выпадающего списка, чтобы переменная `user` была корректно типизирована.

Нужно правильно расставить в пропуски предложенные варианты
function parseJSON<T>(jsonString: string): T {
  return JSON.parse(jsonString);
}

interface User {
  name: string;
  age: number;
}

const jsonString = '{"name": "Alice", "age": 30}';

const user = parseJSON<input1S>(jsonString);

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

7. Доступ к полю

id: 40774_ts_json_give_result_property

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

Что должно получиться?
interface UserData {
  name: string;
  details: {
    city: string;
    country: string;
  };
}

const jsonString = '{"name":"alice","details":{"city":"paris","country":"france"}}';
const user: UserData = JSON.parse(jsonString);
console.log(user.details.country);
Сообщения
Проверить
Показать подсказку

8. Поля для маппинга

id: 40774_ts_json_click_keys

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

Кликните по всем фрагментам, которые подходят под условие задания.
{
  {{"id"~|~t1}}: 12345,
  {{"username"~|~t2}}: {{"john_doe"~|~t6}},
  {{"email"~|~t3}}: "john@example.com",
  {{"age"~|~t4}}: 28,
  {{"isActive"~|~t5}}: true,
  {{"createdAt"~|~t7}}: "2023-01-15T10:30:00Z",
  {{"updatedAt"~|~t8}}: "2023-06-20T14:45:00Z",
  {{"lastLoginIp"~|~t9}}: "192.168.1.1"
}
Сообщения
Проверить
Показать подсказку

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

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