JSONからTypeScriptインターフェースを生成
サンプルのオブジェクトを貼り付けると、すぐ使えるTypeScriptのインターフェースが得られます。例では id が number、tags が string[] になり、display-name のキーは引用符で守られ、全体が UserRecord という名前になります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
本ツールはサンプルを解析し、ルートがオブジェクトであることを検証したうえで、文字列、数値、真偽値、null、配列、入れ子オブジェクトに対応する決定的な定義を生成します。
型の決まり方
生成ツールはキーの名前ではなく、サンプルの各値を見て型を決めます。文字列は string、数値はすべて number、真か偽の値は専用の型、空の値は null になります。オブジェクトの中のオブジェクトは入れ子の型になり、配列は最初の要素だけでなくすべての要素から判断されます。文字列だけの配列は string[]、混在した配列は (string | number | null)[] のような和集合になります。display-name のようにそのまま書けないキーは引用符で守られ、プロパティの順序は元のサンプルのままです。
よくある誤りと避け方
サンプルが1つでは項目が省略可能かどうかを証明できないため、すべてのプロパティが必須として出力されます。実際のデータで欠けることがある項目は手で調整してください。空の配列は手がかりがないため unknown[]、空のオブジェクトは Record<string, never> になるので、中身の入ったサンプルを選ぶのが確実です。入力はJavaScriptではなく厳密なデータの書式で、名前は二重引用符で囲み、コメントや末尾のカンマは使えず、最上位はオブジェクトである必要があります。
入れ子オブジェクトは、ルートインターフェース内のオブジェクト型として表されます。1件のサンプルだけでは省略可能かどうかを証明できないため、サンプルに存在するプロパティはすべて必須として出力されます。<code>UserResponse</code>のようなルート名も指定できますが、有効かつ予約語ではないTypeScript識別子でなければなりません。
省略時は<code>RootObject</code>です。コメントと末尾のコンマは使用できません。ルートのスカラー、null、配列は拒否されます。
配列、null、入れ子構造の推論をご確認ください
配列の推論では、先頭だけでなくサンプル内の全要素を確認します。文字列だけの一覧は<code>string[]</code>となり、異なる型を含む一覧は<code>(string | number | null)[]</code>のような安定したユニオンになります。
空の配列からは要素型を判断できないため、推測による誤解を避けて<code>unknown[]</code>とします。配列内のオブジェクトはインラインオブジェクト型で表し、入れ子の配列は再帰的に処理します。空白、記号、予約語などにより通常のTypeScript識別子として使えないキーは、引用符付き文字列プロパティとして出力します。
省略可能記号、日付型、リテラル型、列挙型、ドメイン固有のクラス名をサンプルだけから作り出すことはありません。
活用例
フィクスチャと連携を準備します
設定、インポート済みレコード、テストデータの安定した入れ子型を、各プロパティの手動確認なしで生成できます。
よくある質問
空の配列はどの型になりますか?
空のサンプルから要素型を判断できないため、unknown[]になります。
どのようなテキストを貼り付けられますか?
最上位がオブジェクトである厳密なデータのテキストです。名前は二重引用符で囲み、コメントや末尾のカンマは使えません。最上位が単独の値、null、配列の場合は受け付けません。
インターフェースの名前は選べますか?
はい。UserRecord のような名前を指定できます。TypeScriptで有効かつ予約語でない名前が必要で、空のままなら RootObject という名前になり、何度実行しても同じ結果になります。
値が混在した配列はどの型になりますか?
最初の要素だけでなく、すべての要素を確認します。文字列だけなら string[]、混在していれば (string | number | null)[] のような安定した和集合になり、サンプルの内容がそのまま反映されます。
プロパティは省略可能として出力されますか?
いいえ。サンプルが1つでは省略可能だと証明できないため、見つかったプロパティはすべて必須として出力されます。実際に欠けることがある項目は、生成後に手で調整してください。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev2/json-to-typescript-interface \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"json":"{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"}'const res = await fetch("https://api.kit.forhosting.com/dev2/json-to-typescript-interface", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"json": "{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/json-to-typescript-interface",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"json": "{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/json-to-typescript-interface", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"json":"{\\"id\\":42,\\"name\\":\\"Ada\\",\\"active\\":true,\\"tags\\":[\\"admin\\",\\"editor\\"],\\"profile\\":{\\"email\\":\\"ada@example.com\\",\\"score\\":9.5}}"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"json":"{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/json-to-typescript-interface", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"json": "{\"id\":42,\"name\":\"Ada\",\"active\":true,\"tags\":[\"admin\",\"editor\"],\"profile\":{\"email\":\"ada@example.com\",\"score\":9.5}}"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.json_to_typescript_interface",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_chars | 1000000 |
max_depth | 64 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
代表的なJSONオブジェクトを、ジェネレーターの導入や入れ子値の手作業による確認なしでTypeScriptインターフェースへ変換できます。特殊なJSONキーは引用符で安全に表し、ルートインターフェース名も指定できます。生成結果は、アプリケーション、SDK、テストフィクスチャ、データ連携の実用的な初期型としてそのままコピーしていただけます。
代表的なJSONオブジェクトをご用意ください
ルート値がオブジェクトである有効なJSONを貼り付けてください。APIレスポンス、設定レコード、Webhookペイロード、保存済み文書などをご利用いただけます。ジェネレーターはフィールド名ではなく値を調べるため、文字列は<code>string</code>、JSONの数値は<code>number</code>、真偽値は<code>boolean</code>、null値は<code>null</code>になります。実用的な結果を得るには、アプリケーションが実際に受信するフィールドと値の種類を含むサンプルをお選びください。入力はJavaScriptオブジェクト構文ではなくJSONテキストである必要があり、プロパティ名には二重引用符が必要です。
配列、null、入れ子構造の推論をご確認ください
このため、出力は提供されたJSONから得られる根拠を正確に反映します。空のオブジェクトは<code>Record<string, never></code>となり、既知のフィールドが観測されなかったことを示します。プロパティ順は元のJSONに従い、ユニオンの構成要素は決定的な順序になります。
本番利用前に生成された定義をご確認ください
あるサンプルがnull、別のサンプルが文字列なら、その知識を保守する型へ反映してください。同じ入力とインターフェース名からは、ネットワーク、モデル、乱数、現在日時に依存せず、常に同じテキストが生成されます。生成された定義は、提供されたサンプルを正確に表す実装用の優れた初稿ですが、外部APIの完全な契約を保証するものではありません。プロパティを省略可能、null許容、より限定的、または名前付きインターフェースで共有すべきか判断する前に、複数のペイロードや提供元の文書と比較してください。JSONには日付型がないためタイムスタンプは文字列のままであり、TypeScriptは実行時にJSON整数を区別しないため整数も<code>number</code>になります。無効なJSON、入力テキストの不足、無効な名前、深すぎる入れ子、オブジェクト以外のルートには<code>invalid_input</code>を返します。API料金は1回あたり$0.002からで、ブラウザーでも同じ純粋な推論処理をご利用いただけます。
連携の活用例
未知のAPIレスポンスに型を付けます
取得したレスポンスから実用的な初期インターフェースを作り、文書に基づいて省略可能フィールドを調整できます。
Webhookペイロードを文書化します
代表的なイベントを、受信サービスとテストで共有できる読みやすいTypeScriptへ変換できます。
技術的な質問
どのような入力を利用できますか?
jsonフィールドには、ルート値がオブジェクトである有効なJSONテキストが必要です。ルートの配列、スカラー、nullは拒否されます。
プロパティは省略可能になりますか?
いいえ。サンプルに存在するプロパティは必須です。複数のペイロードや正式なスキーマで省略可能フィールドをご確認ください。
日付や列挙型を認識しますか?
いいえ。JSON文字列はstringのままであり、1件のサンプルからドメイン上の意味やenum制約は推論しません。
APIリクエストの料金はいくらですか?
API料金は1回あたり$0.002からです。ブラウザー版でも同じ決定的なロジックを使用します。