Перейти к содержимому

Легкое преобразование JSON в определения TypeScript — Numio

Генерирует интерфейсы TypeScript или псевдонимы типов из примера JSON, например ответа API. Вложенность, null и смешанные массивы обрабатываются, а преобразование выполняется в вашем браузере.

Converted in your browser. Null stays a value type; ? marks a field missing from some objects in an array. Empty arrays use unknown elements.

Load an example (replaces your input)

JSON

TypeScript

Когда пригодится

  • Создать именованные типы TypeScript для ответа API.
  • Сравнить несколько объектов в массиве, чтобы увидеть различающиеся типы и необязательные поля.

Как пользоваться

  1. Вставьте реальный JSON или загрузите один из примеров. Загрузка примера заменяет ваш ввод.
  2. Задайте имя корневого типа и выберите interface (вложенные объекты становятся отдельными типами) или type (один псевдоним типа с вложенными объектами внутри).
  3. Проверьте null, необязательные поля (?) и объединения string/number, затем скопируйте типы.

Ввод JSON

[{"id":1,"name":"Tokyo"},{"id":2}]

Результат TypeScript (Root, interface)

export type Root = RootValueItem[];

export interface RootValueItem {
  id: number;
  name?: string;
}

Подробности и ограничения

Проверяется каждый элемент массива. В примере name отсутствует во втором объекте, поэтому становится необязательным; поле, которое присутствует со значением null, вместо этого становится объединением с null.

Пустой массив даёт unknown[]. Смешанные массивы становятся массивами объединённого типа, а не кортежами фиксированной длины.

Типы покрывают только то, что есть в примере. Поля, которые ни разу не встречаются, форматы дат или email, диапазоны значений и связи между полями не выводятся.

Ввод должен быть стандартным JSON; сначала уберите комментарии или висячие запятые с помощью форматтера JSON. ID с ведущими нулями вводите строками.

Ввод ограничен 1 000 000 символов, примерно 64 уровнями вложенности и 50 000 значений. Типы TypeScript не проверяют данные во время выполнения.

FAQ

Что генерировать: interface или type?

Оба описывают одну и ту же форму. interface создаёт по именованному интерфейсу на каждый вложенный объект, их удобно переиспользовать; type создаёт один псевдоним типа с вложенными объектами, записанными внутри.

Может ли он сгенерировать класс TypeScript?

Нет, генерируются только интерфейсы или псевдонимы типов. Если нужна проверка во время выполнения, используйте JSON to Zod и подстройте схему под свои правила.

Чем null отличается от необязательного поля?

В {"name":null} есть name со значением null; в {} name нет вовсе. null остаётся в типе, а ? добавляется, только если в некоторых объектах того же массива поля нет.

Что даёт JSON-массив на корневом уровне?

Псевдоним типа для массива и интерфейс для его элементов, как в примере выше, где Root — это RootValueItem[].

Спецификации и справка