固定長JSON配列をTypeScriptタプル型に変換する

固定長のJSON配列をジェネリック配列ではなくTypeScriptタプル型として表現する方法を学びます。位置ごとの型情報を保持。

Advanced Patterns

詳細な説明

TypeScriptにおけるタプル vs 配列

通常のTypeScript配列(string[])は同じ型の任意の数の要素を許可します。タプル([string, number])は各位置の型を指定した正確な数の要素を指定します。

JSON例

{
  "coordinates": [39.7817, -89.6501],
  "range": [1, 100],
  "nameAge": ["Alice", 30]
}

生成されるTypeScript

interface Root {
  coordinates: [number, number];
  range: [number, number];
  nameAge: [string, number];
}

なぜタプルが重要か

タプルがなければ、coordinatesnumber[]として型付けされ、任意の長さの配列を許可してしまいます。タプルは要素が正確に2つであることを強制し、nameAgeでは要素0がstringで要素1がnumberであることを保持します。

タプル要素へのアクセス

TypeScriptは各インデックスの型を認識します:

const [lat, lng] = data.coordinates;
// lat: number, lng: number

const [name, age] = data.nameAge;
// name: string, age: number

コンバーターがタプルを選択する条件

コンバーターは以下の場合にタプルを生成します:

  1. 配列が固定された小さな長さ(通常2-5要素)を持つ。
  2. 要素が混合型である(例:[string, number])。
  3. 複数のサンプルが同じ長さを一貫して示す。

長さがサンプル間で異なる場合、コンバーターはユニオン配列((string | number)[])にフォールバックします。

ラベル付きタプル(TypeScript 4.0+)

ドキュメント用にラベルを追加できます:

type GeoCoord = [lat: number, lng: number];
type NameAge = [name: string, age: number];

ラベルは型チェックに影響しませんが、エディタのホバー情報や関数シグネチャを大幅に改善します。

オプショナルタプル要素

type Response = [number, string, string?];
// 2つまたは3つの要素

これは一部のAPIレスポンスが追加の詳細としてオプショナルな3番目の要素を含む場合に有用です。

ユースケース

位置情報APIが座標を2要素配列として返し、TypeScriptが緯度と経度が正確に存在することを強制する型が必要な場合に使用します。

試してみる — JSON to TypeScript

フルツールを開く