Что делает инструмент
Генератор JSON в TypeScript читает пример JSON, например ответ API или файл конфигурации, и пишет интерфейсы TypeScript, которые его описывают. Вместо того чтобы вручную набирать каждое поле, вставьте один настоящий ответ и получите типы, готовые для результатов fetch, состояния Redux или тестовых данных.
Генератор смотрит на каждое значение, а не только на первое. Числа становятся number, текст — string, вложенные объекты получают свои интерфейсы, а элементы массива объединяются, так что поле, которое есть лишь в некоторых элементах, помечается как необязательное, а поле, иногда равное null, типизируется как допускающее null.
Как пользоваться
- Вставьте JSON в поле ввода, загрузите файл
.jsonили нажмите Пример. - Задайте имя корневого типа и выберите стиль:
interfaceилиtype, null как| nullили как необязательные поля, свойстваreadonlyи нужно ли добавлятьexportк каждому объявлению. - Скопируйте TypeScript или скачайте его как файл
.ts.
Некорректный JSON отмечается строкой и столбцом ошибки, чтобы пример можно было сразу исправить.
Пример
Этот JSON:
{ "id": 7, "name": "Ada", "tags": ["admin"], "manager": { "id": 1, "email": null } }
превращается в такие объявления:
export interface Root {
id: number;
name: string;
tags: string[];
manager: Manager;
}
export interface Manager {
id: number;
email: null;
}
Советы
- Один пример показывает только то, что в нём есть. Если поле может быть строкой или null, включите оба варианта или поместите несколько примеров в массив, чтобы они объединились.
- Имена полей, которые не являются допустимыми идентификаторами, например first-name, пишутся в кавычках, поэтому результат всегда компилируется.
- Результат — это отправная точка. Сужайте строковые поля до объединений литералов или
Date, если знаете больше, чем показывает пример. - Нужен Go? Конвертер JSON в Go использует тот же вывод типов и пишет структуры с тегами json.
Частые вопросы
› Как обрабатываются вложенные объекты?
Каждый вложенный объект становится отдельным именованным интерфейсом, названным по ключу в PascalCase, поэтому поле address даёт интерфейс Address. Объекты с полностью одинаковой структурой используют общий интерфейс, а при совпадении имён добавляется номер, например Address2.
› Как типизируются массивы?
Все элементы массива объединяются в один тип элемента. Массив объектов становится массивом интерфейса, названного по ключу в единственном числе, поэтому orders даёт Order[]. Смешанные массивы становятся объединением вроде (string | number)[], а пустые массивы — unknown[].
› Когда поле помечается как необязательное?
Когда оно отсутствует в некоторых объектах массива. Поле, которое есть везде, но иногда равно null, по умолчанию записывается как T | null. Переключите значения null в режим необязательных, чтобы убрать null и пометить поле вопросительным знаком.
› Что выбрать, interface или type?
Оба описывают одни и те же формы объектов. Интерфейсы можно расширять и объединять, и многие руководства по стилю советуют их для объектных типов. Псевдонимы type удобны, если вы собираетесь комбинировать результат с объединениями или отображёнными типами. Выбирайте то, что принято в вашем коде.
› Отправляется ли мой JSON на сервер?
Нет. Типы выводятся в браузере, поэтому можно смело вставлять настоящие ответы API.