JSON から TypeScript へ: 手書き interface をやめる

2024-08-04

手書きインターフェースは実際の API レスポンスとずれやすくなります。サンプル JSON から型を生成する方法は定番ですが、推論の前提と限界を理解することが重要です。

なぜ型生成するのか

コンパイル時にタイポや null アクセスを検出でき、OpenAPI がない/古い場合でも実データから型を定義できます。

手動マッピング例

JSON
{ "id": 1, "name": "Alice", "email": null }
TypeScript
interface User {
  id: number;
  name: string;
  email: string | null;
}

ネスト配列とユニオン

空配列は要素型を手動指定する必要があり、異種配列はユニオン型になります。

optional と null の違い

キー欠落(email?)と null 値(email: string | null)は別の意味です。バックエンドの仕様に合わせて定義しましょう。

ツール

quicktype CLI、json-schema-to-typescript、単発用途ならオンライン json2ts が便利です。

# npx quicktype sample.json -o types.ts --lang typescript

ベストプラクティス

生成ファイルは手編集より再生成を基本にし、複数サンプルで型精度を上げ、API 変更は tsc で早期検知します。