JSON → TypeScript
Вставьте пример ответа API или файл конфигурации в формате JSON и получите интерфейсы TypeScript для них. Вложенные объекты становятся отдельными именованными типами, элементы массивов объединяются в один тип с необязательными полями.
Как пользоваться
Вставьте JSON в поле слева или откройте файл. Типы обновляются сами во время ввода. В поле «Имя типа» задайте имя корневого объявления, например User, а переключатель выбирает запись через interface или type. При синтаксической ошибке место подчёркивается в поле; если JSON «грязный», сначала исправьте его в инструменте «Исправление JSON».
Код обрабатывается в браузере, не отправляется на сервер и не сохраняется после закрытия страницы. Размер — до 2 МБ в UTF-8.
Длительную обработку можно остановить кнопкой «Отменить обработку». Изменение ввода прерывает предыдущий расчёт; для повторного запуска измените данные или нажмите кнопку примера. Если документ слишком сложен, появится сообщение с предложением разделить его на части.
Для вашего удобства рекомендую использовать полноэкранный режим.
JSON
{
"id": 42,
"name": "basicweb",
"tags": ["html", "css"],
"author": { "name": "Денис", "email": null },
"articles": [
{ "title": "Flexbox", "views": 1200 },
{ "title": "Grid", "views": 950, "draft": true }
]
}TypeScript
Для генерации типов включите JavaScript. Пример: {"id": 1, "tags": ["html"]} даст interface Root { id: number; tags: string[]; }.
Как строятся типы
- Строки, числа и логические значения становятся
string,numberиboolean; значениеnull— типомnull. - Вложенный объект получает имя по ключу:
author→Author,user_profile→UserProfile. Объекты с одинаковой структурой используют одно имя. - Элементы массива объединяются: поле, которого нет хотя бы в одном элементе, становится необязательным (
?), разные типы значений дают объединение вродеstring | null. Имя элемента — в единственном числе:articles→Article. - Пустой массив описывается как
unknown[]: по пустому образцу тип элемента неизвестен. - Ключи с дефисами и пробелами записываются в кавычках:
"user-name": string.
JSON и созданные типы с именем Articles:
[
{ "title": "Flexbox", "views": 1200 },
{ "title": "Grid", "views": 950, "draft": true, "author": null }
]export type Articles = ArticlesItem[];
export interface ArticlesItem {
title: string;
views: number;
draft?: boolean;
author?: null;
}Что проверить вручную
Типы строятся по одному образцу данных, поэтому знают только то, что в нём есть. Если поле в примере равно null, его настоящий тип неизвестен — замените null на string | null или другой тип по документации API. Если поле присутствует во всех элементах примера, но в реальных ответах бывает пропущено, добавьте ? вручную. Конкретные значения вроде "admin" не превращаются в литеральные типы — при необходимости сузьте string до объединения допустимых строк.
Вопросы и ответы
Чем interface отличается от type?
Для описания объектов они почти взаимозаменяемы. interface можно расширять и дополнять повторным объявлением, а type умеет описывать объединения и псевдонимы любых типов. Массив или значение в корне JSON всегда описывается через type.
Почему поле получилось необязательным?
Поле есть не во всех элементах массива из примера. Если в реальных данных оно обязательно, уберите ? или добавьте в пример элемент, где поле заполнено.
Безопасно ли вставлять ответы API?
Да. Типы создаются в вашем браузере, данные не отправляются на сервер и не сохраняются после закрытия вкладки.
Изучить JSON
Синтаксис JSON и его разбор в JavaScript описаны в статьях об объекте JSON и методе JSON.parse().