Генерация типов

JSON в TypeScriptтипы с учётом различий между ответами

Сравните отсутствующее поле tag и null в score в примере. Для явного контракта выберите вспомогательный режим Schema.

JSON в TypeScript

Входной JSON

Разбор и генерация выполняются в этом браузере. Ввод не отправляется и не сохраняется.

Результат TypeScript

Параметры генерации

Пропущенные поля необязательны; null сохраняется. Пустые массивы — unknown[]. Используйте strictNullChecks в проекте.

Объявлений: 3 · необязательных свойств: 1

JSON в TypeScript помогает подготовить первую модель ответа API. Один успешный ответ может скрыть поля, которые иногда отсутствуют. Соберите несколько характерных записей в массив, прежде чем переносить объявления в проект.

Конвертер различает отсутствие свойства и явно переданное значение null. Результат нужно сверить с документацией API: будущие варианты, ответы с ошибками и правила предметной области нельзя восстановить по одной удачной выборке.

Зачем использовать JSON в TypeScript здесь

Учитывать каждую запись массива

JSON в TypeScript анализирует все переданные элементы. Если у одного объекта нет tag, свойство становится необязательным. Если score содержит число и null, создаётся объединение. Отсутствие поля и пустое значение не подменяют друг друга.

Две записи объединяются в тип: пунктир отмечает отсутствующее поле, а пустой маркер обозначает null.

Дополнить образец явным контрактом

Schema позволяет задать обязательные свойства и допустимые значения enum, которых не видно в примере. Режим нужно выбрать явно. Неподдерживаемое ограничение останавливает генерацию с указанием пути, а не пропускается при создании объявления.

Образцы и структурный контракт по разным путям переходят в карточки объявлений типов.

Что проверить перед экспортом

01

Собрать варианты в одной позиции

Поместите записи в корректный JSON-массив. Сравниваются объекты в одной структурной позиции; одинаковые названия свойств в других частях документа не превращают их автоматически в общую модель.

02

Выбрать режим до загрузки примера

Смена режима сохраняет введённый текст. Кнопка примера загружает данные для выбранного режима. В Schema обязательность задаёт required; переключатель всех необязательных полей влияет только на образцы.

03

Дождаться актуального результата

Автогенерация ждёт 350 мс после изменений. Отключите её для появления кнопки генерации или нажмите Ctrl/Cmd+Enter. Любое изменение блокирует экспорт до успешного обновления. Root служит основой производных имён.

От значений к именованным объявлениям

Типы по всем элементам массива

Числа и строки в одной позиции образуют объединение. Вложенные массивы тоже анализируются. Пустой массив использует сведения о типах непустых массивов в той же позиции; если элементов нет нигде, остаётся unknown[]. Кортежи фиксированной длины не создаются.

Опциональные поля и null отдельно

Свойство, отсутствующее в части объектов, получает ?. Явный null остаётся null или частью объединения. По одному null нельзя угадать string или number. Включите strictNullChecks в проекте, чтобы различие учитывалось при проверке типов.

Генерация интерфейсов TypeScript с именами

Вложенные объекты получают собственные объявления с именами от родительских полей. Совпадения разрешаются стабильными числовыми суффиксами. Исходные ключи сохраняются, при необходимости в кавычках. Имя корня — ASCII-идентификатор до 64 символов, без зарезервированных слов.

Ограниченный режим Schema

Поддерживаются логические схемы, type, properties, required, одиночная схема items, логическое additionalProperties, скалярные enum/const и ограниченный anyOf. Выберите interface или type, export и отступ в два или четыре пробела. integer выражается как number.

Границы вывода по образцу

Образец не описывает весь API
Учитываются только переданные значения. Объединение по полям теряет связи между дискриминатором и другими свойствами. Даты и UUID остаются string, набор enum по образцу не угадывается. Недостающие варианты нужно добавить самостоятельно.
Без проверки во время исполнения
Вывод содержит объявления, но не парсеры, классы, Zod или сериализаторы. number не гарантирует целые значения и безопасную точность. additionalProperties=false убирает индексную сигнатуру, но структурная типизация не запрещает лишние поля во время исполнения.
Неизвестные ограничения вызывают ошибку
Ссылки, определения, oneOf/allOf, условия, format, шаблоны, длины, диапазоны и кортежи отклоняются. Ключевые слова объектов и массивов требуют явного подходящего type. Схема в additionalProperties, объекты и массивы в enum, слишком большие числовые литералы не поддерживаются.
Только строгий единый документ JSON
Комментарии, завершающие запятые, повторные ключи и JSONL прерывают преобразование. Синтаксические ошибки указывают строку и столбец. Нет исправления, загрузки URL, импорта файлов или пакетного режима. Поле type не включает Schema автоматически.
Лимиты без обрезанных объявлений
Не более 500 000 символов ввода, 100 уровней, 50 000 узлов, 1 000 000 символов вывода и 1 000 объявлений. Превышение запрещает экспорт. Пустой объект без сведений о полях получает индексную сигнатуру unknown вместо слишком широкого типа {}.

Вопросы про JSON в TypeScript

Что выбрать для данных JSON: type или interface?

Ориентируйтесь на правила проекта. Здесь interface применяется к объявлениям объектов. Для массива, примитивного значения или объединения в корне всё равно нужен псевдоним type, даже если выбран interface.

Как обрабатываются опциональные поля и null?

Отсутствующее в части записей свойство получает ?, а явный null сохраняется в типе значения. Если встречаются и число, и null, получается number | null. Переключатель необязательных полей не удаляет пустые значения.

Как обрабатываются массивы объектов?

Каждый объект в данной позиции участвует в объединении полей. Свойства, отсутствующие хотя бы в одном объекте, становятся необязательными. По одной записи нельзя узнать, какое поле может пропасть в другом ответе.

Как преобразуются вложенные объекты?

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

Что происходит с null и значениями разных типов?

Наблюдаемые типы объединяются: например, число и строка дают number | string. null остаётся самостоятельным членом объединения. Если массив полностью пуст, тип элемента unknown; без данных инструмент не выбирает произвольную модель.

Нашли спорный результат вывода типов?

Начните с нескольких ответов

Используйте JSON в TypeScript для нескольких вариантов ответа, проверьте необязательные свойства и null, затем перенесите объявления в проект для дальнейшей проверки.