自己参照JSONから再帰的なTypeScript型を生成する

ツリー、コメント、メニューなどの自己参照JSON構造を再帰的なTypeScript interfaceに変換する方法を学びます。

Complex Types

詳細な説明

JSONにおける再帰構造

多くのデータモデルは本質的に再帰的です。ファイルシステム、コメントスレッド、組織図、ナビゲーションメニューはすべて、同じ型を参照するノードを含みます。

JSON例

{
  "id": 1,
  "name": "Root",
  "children": [
    {
      "id": 2,
      "name": "Child A",
      "children": [
        { "id": 4, "name": "Grandchild", "children": [] }
      ]
    },
    {
      "id": 3,
      "name": "Child B",
      "children": []
    }
  ]
}

生成されるTypeScript

interface TreeNode {
  id: number;
  name: string;
  children: TreeNode[];
}

再帰の検出方法

コンバーターはJSON構造を走査し、ネストされたオブジェクトの形状を親と比較します。子オブジェクトが祖先と同じキーセットと互換性のある値型を持つことを発見した場合、無限のネスト型を作成する代わりに自己参照interfaceを生成します。

コメントスレッド例

{
  "id": 100,
  "author": "Alice",
  "text": "Great article!",
  "replies": [
    {
      "id": 101,
      "author": "Bob",
      "text": "Thanks!",
      "replies": []
    }
  ]
}
interface Comment {
  id: number;
  author: string;
  text: string;
  replies: Comment[];
}

相互再帰型

2つの型が互いを参照する場合もあります:

interface Folder {
  name: string;
  files: File[];
  subfolders: Folder[];
}

interface File {
  name: string;
  size: number;
  parent: Folder;
}

TypeScriptはinterface間の前方参照をシームレスに処理するため、宣言順序は重要ではありません。

深さの安全性

再帰型を使用する際は、スタックオーバーフローを避けるために走査やレンダリングの最大深度を常に設定してください。型自体には深度制限がありません。これはランタイムの問題です。

ユースケース

各コメントがネストされた返信を持てるコメントシステムを構築し、任意の深さのスレッド全体をモデル化する単一の再帰型が必要な場合に使用します。

試してみる — JSON to TypeScript

フルツールを開く