UTILS.
100% в браузере
📘

JSON Schema в TypeScript

Скомпилируйте JSON Schema (draft-07 или 2020-12) в интерфейсы и псевдонимы типов TypeScript, обрабатывая required, enum, $ref, массивы и комбинаторы.

результат

Об этом инструменте

Инструмент JSON Schema в TypeScript компилирует документ JSON Schema в интерфейсы и псевдонимы типов TypeScript, делая то же, что популярная библиотека json-schema-to-typescript, без установки набора инструментов. В отличие от конвертеров примеров JSON, этот читает настоящую схему: он обходит объект схемы и превращает type:'object' в интерфейс, где ключи, перечисленные в required, обязательны, а остальные помечаются знаком ?.

Всё разбирается и генерируется локально в вашем браузере через JSON.parse и обычный JavaScript, поэтому ваша схема никогда не покидает страницу. Строковые схемы с enum становятся объединением строковых литералов; простые string, number/integer, boolean и null отображаются на свои эквиваленты TypeScript; массивы становятся T[] (кортежем, когда items — массив). Комбинаторы поддерживаются — allOf становится пересечением (A & B), а anyOf / oneOf становятся объединениями (A | B) — и nullable-тип type:[T,'null'] становится T | null.

Ссылки разрешаются по имени: $ref, указывающий на #/definitions/X или #/$defs/X, выдаёт именованную ссылку на тип, и каждое определение генерируется как собственный export interface или export type. additionalProperties добавляет индексную сигнатуру [key: string]: T. Имя корневого типа откатывается к title или $id схемы. Переключайте вывод interface или type и то, становятся ли строки description схемы комментариями JSDoc /** */. Скопируйте результат или скачайте файл .ts.

Часто задаваемые вопросы

Какие возможности JSON Schema поддерживаются?
object с properties и required, строковые enum как объединения литералов, number/integer/boolean/null, массивы (включая кортежи), комбинаторы allOf/anyOf/oneOf, $ref на definitions или $defs, additionalProperties как индексная сигнатура и nullable-массивы типов вроде ["string","null"].
Как обрабатываются $ref и definitions?
$ref вроде #/definitions/Address (или #/$defs/Address) становится ссылкой на именованный тип Address, а каждая запись в definitions или $defs выдаётся как собственный export interface или export type, так что ссылки разрешаются внутри вывода.
Что задаёт имя корневого типа?
Поле имени корня, если вы его задали, иначе title схемы, иначе последний сегмент её $id, иначе Root. Имена определений берутся из их ключа в definitions или $defs, преобразованного в PascalCase.
Могу ли я сохранить описания схемы?
Да. При включённом JSDoc (по умолчанию) любая строка description на схеме или свойстве выдаётся как комментарий /** ... */ над соответствующим типом или полем, сохраняя документацию в сгенерированном TypeScript.

Больше инструментов