JSON → TypeScript ジェネレーター

JSONからTypeScriptのinterfaceを自動生成。ネストオブジェクト・配列・Union型・省略可能プロパティに対応。ブラウザ内で処理、無料。

  • ブラウザ内で処理
  • データはブラウザ外に出ません
  • 無料 · 登録不要
有効な TypeScript 名を入力します。空欄では RootObject を使います。変更後は 「TypeScript を生成」をクリックして適用します。
生成するすべてのオブジェクトプロパティに ? を付けます。オフでも、配列の一部の要素にないフィールドは省略可能です。「TypeScript を生成」で適用します。
オブジェクト宣言に interface の代わりに type を使います。プリミティブのルート値は常に type を使います。「TypeScript を生成」で適用します。
現在の JSON、ルート名、設定で生成します。名前や設定の変更後にクリックして適用します。Ctrl/⌘+Enter でも生成できます。
JSON 入力を、ネストされたオブジェクト、配列、null を含むサンプルに置き換えます。現在のルート名と設定ですぐに生成します。
JSON、出力、ステータスを消去し、ルート名と両方の設定を保持します。ツール内で Ctrl/⌘+L を押すとルート名も消去します。
コメントや末尾のカンマを含まない有効な JSON を入力します。入力を止めてから 300 ミリ秒後に生成します。無効な JSON では出力を消去し、エラーを表示します。
TypeScript 出力
表示中の TypeScript 出力を全文コピーします。出力が空の場合はコピーしません。

JSON を入力するかサンプルを読み込むと、TypeScript を生成します。

例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。

型推論ルール

  • null → 省略可能な null(field?: null)
  • 文字列 → string
  • 数値 → number
  • 真偽値 → boolean
  • 空配列 → unknown[]
  • オブジェクト配列 → マージされたインターフェース + ItemName[]
  • 混合プリミティブ配列 → Union型(例: (string | number)[])
  • ネストオブジェクト → 独立した名前付きインターフェース

例

以下のJSONを入力すると:

{"user": {"name": "Alice", "age": 30}, "tags": ["admin", "user"]}

次のように生成されます:

interface RootObject {
  user: User;
  tags: string[];
}

interface User {
  name: string;
  age: number;
}

例:API レスポンス

{
  "user": {
    "id": 42,
    "name": "Alice",
    "email": "alice@example.com",
    "roles": ["admin", "editor"],
    "preferences": { "theme": "dark", "notifications": true },
    "lastLogin": null
  },
  "pagination": { "page": 1, "perPage": 20, "total": 143 }
}

から次の型が生成されます。

interface RootObject {
  user: User;
  pagination: Pagination;
}

interface User {
  id: number;
  name: string;
  email: string;
  roles: string[];
  preferences: Preferences;
  lastLogin?: null;
}

interface Preferences {
  theme: string;
  notifications: boolean;
}

interface Pagination {
  page: number;
  perPage: number;
  total: number;
}

ルートのインターフェースが先頭に来て、ネストしたインターフェースは見つかった順に続きます。null の値は型 null として出力され、省略可能になります。1つのサンプルからは値があるときの型がわからないためです。API ドキュメントを確認して lastLogin: string | null のように直してください。

例:形の異なる要素を含む配列

{
  "items": [
    { "id": 1, "name": "a", "tags": [] },
    { "id": 2, "price": 9.5, "tags": ["x", 1] }
  ],
  "messages": [
    { "type": "text", "content": "hi" },
    { "type": "image", "url": "/a.png" }
  ]
}

から次の型が生成されます。

interface RootObject {
  items: ItemsItem[];
  messages: MessagesItem[];
}

interface ItemsItem {
  id: number;
  name?: string;
  tags: (unknown[] | (string | number)[]);
  price?: number;
}

interface MessagesItem {
  type: string;
  content?: string;
  url?: string;
}

配列内のオブジェクトはすべてマージされ、一部の要素にしかないキーには ? が付きます。messages は実際には type で区別される2つの形です。マージ後のインターフェースは「url を持つ text メッセージ」のような不正な組み合わせも通すので、判別可能なユニオン型に書き直します(TypeScript Handbook: Narrowing):

type Message =
  | { type: "text"; content: string }
  | { type: "image"; url: string };

例:同じキー名のオブジェクトが 2 つある場合

{
  "order": { "id": "A-1001", "meta": { "createdBy": "alice", "source": "web" } },
  "payment": { "status": "paid", "meta": { "provider": "stripe", "fee": 0.3 } }
}

から生成される型:

interface RootObject {
  order: Order;
  payment: Payment;
}

interface Order {
  id: string;
  meta: Meta;
}

interface Meta {
  createdBy: string;
  source: string;
}

interface Payment {
  status: string;
  meta: PaymentMeta;
}

interface PaymentMeta {
  provider: string;
  fee: number;
}

order.meta は Meta という名前になります。payment.meta はフィールドが違うので別のインターフェースになり、親の名前を前に付けた PaymentMeta になります。order.meta と同じフィールドなら、両方とも Meta を共有します。2 つをすべて省略可能なフィールドの Meta にまとめると、どちらの API も返さないオブジェクトまで受け入れてしまうため、形ごとに型を分けています。名前がまだ使われている場合は番号を付けます(Meta2)。ネストしたキーがルートと同じ名前でも、ルートは指定した名前のままです。

手で直すところ

  • null のフィールド:?: null を実際の型と | null に置き換えます。
  • 空配列:[] は unknown[] になるので要素の型を補います。
  • 日付:ISO 8601 文字列と Unix タイムスタンプはそれぞれ string・number のままです。
  • 識別子として使えないキー(user-name、2fa)は引用符付きで出力されます。TypeScript として有効です。
  • PaymentMeta や Meta2 のような名前は JSON のキーから作られます。用途に合わせて名前を変えてください。
  • 有効な型名にならないキー(2fa、空のキー)は、インターフェース名の先頭に T を付けます(T2fa)。プロパティ自体は元のキーを引用符付きで使います。

制限

  • 入力は有効な JSON である必要があります(コメントや末尾のカンマは不可)。エラーメッセージに位置が表示されます。
  • 型は貼り付けたサンプルだけから決まります。サンプルでは文字列でも本番で数値になることがあるフィールドは string のままです。
  • interface の代わりに type を使用を選ぶと、各宣言は type Name = { ... } になります。

FAQ

このツールは何を生成しますか?

JSONオブジェクトからTypeScriptのinterface(またはtype alias)宣言を生成します。ネストされたオブジェクトは個別の名前付きインターフェースになり、配列内の混合型はUnion型になります。

ネストされたオブジェクトはどう処理されますか?

ネストされた各オブジェクトフィールドは、フィールドキーのPascalCase名を持つ独立したインターフェースとして抽出されます。例えば 'address' フィールドは 'Address' インターフェースになり、親インターフェースはその名前で参照します。

オブジェクトの配列はどう処理されますか?

配列にオブジェクトが含まれる場合、すべてのオブジェクトのフィールドがマージされて1つのアイテムインターフェースになります。一部のオブジェクトにしか存在しないフィールドはオプショナルになります。

'Make properties optional' オプションとは何ですか?

チェックすると、生成されるすべてのインターフェースのすべてのプロパティに '?' が付き、省略可能になります。部分的なデータを受け取る可能性がある場合や、緩い型定義が必要な場合に便利です。

interface と type の違いは何ですか?

どちらもオブジェクトの形状を宣言できます。'interface' は宣言マージをサポートし、オブジェクト型の慣用的な書き方です。'type' はより柔軟で、プリミティブ・Union型・タプルも表現できます。'Use type instead of interface' で切り替えられます。

データはサーバーに送信されますか?

いいえ。型推論エンジン全体がブラウザ内で動作します。データは端末の外に出ません。