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.

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