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)になり、null 許容の type:[T,'null'] は T | null になります。

参照は名前で解決されます。#/definitions/X または #/$defs/X を指す $ref は名前付きの型参照を出力し、各定義はそれぞれ export interface または export type として生成されます。additionalProperties はインデックスシグネチャ [key: string]: T を追加します。ルート型名はスキーマの title または $id にフォールバックします。インターフェースと型のどちらを出力するか、スキーマの description 文字列を JSDoc /** */ コメントにするかどうかを切り替えられます。結果はコピーするか .ts ファイルとしてダウンロードできます。

よくある質問

どの JSON Schema 機能に対応していますか?
properties と required を持つ object、リテラルユニオンとしての string enum、number/integer/boolean/null、配列(タプルを含む)、allOf/anyOf/oneOf コンビネーター、definitions や $defs への $ref、インデックスシグネチャとしての additionalProperties、["string","null"] のような null 許容の型配列です。
$ref と definitions はどう扱われますか?
#/definitions/Address(または #/$defs/Address)のような $ref は名前付き型 Address への参照になり、definitions や $defs の各エントリはそれぞれ export interface または export type として出力されるため、参照は出力内で解決されます。
ルート型の名前は何になりますか?
設定した場合はルート名のボックス、なければスキーマの title、なければその $id の最後のセグメント、それもなければ Root です。定義名は definitions や $defs でのキーから来て、PascalCase に変換されます。
スキーマの description を残せますか?
はい。JSDoc を有効(既定)にすると、スキーマやプロパティの description 文字列が対応する型やフィールドの上に /** ... */ コメントとして出力され、生成された TypeScript にドキュメントが保持されます。

その他のツール