TypeScriptのRecord型を深く理解する

TypeScriptでは、Recordは非常に便利な組み込みのジェネリック型で、オブジェクトのキーと値の型を定義することができます。Record型を使用することで、キーと値の型に対して強い型サポートを提供し、キーと値のペアのデータ構造を扱う際に非常に役立ちます。本記事では、Record型の定義、用途、そして実際の使用例について詳しく説明します。

Record型の定義

Record型はTypeScriptが提供するジェネリック型で、2つの型引数を取ります:

1
Record<Keys, Type>;
  • Keys:オブジェクトのキーの型で、通常は文字列、数字、またはユニオン型です。
  • Type:オブジェクトの値の型です。

Recordの役割は、オブジェクトのすべてのキーを特定の値型にマッピングすることです。例えば、オブジェクトのすべてのキーが文字列型で、値が数字型であることを望む場合、Record<string, number>を使用します。

使用シーン

Record型は次のようなシーンで特に便利です:

  1. オブジェクトのキーと値のペアデータ構造の管理:キーと値の型に対して厳格な要件がある場合、Recordは非常に有用です。
  2. インデックスシグネチャの代替:インデックスシグネチャとは異なり、Recordはキー型と値型の制御をより正確に行うことができます。
  3. 辞書データ構造の使用Recordを使用して固定されたキーを持つ辞書構造を表現することができます。

コード例

基本的な使い方

以下の例は、キーが文字列で、値が数字であるオブジェクトを定義する方法を示しています:

1
type Scores = Record<string, number>;
2
3
const studentScores: Scores = {
4
Alice: 85,
5
Bob: 92,
6
Charlie: 78,
7
};
8
9
console.log(studentScores);
10
// 出力: { Alice: 85, Bob: 92, Charlie: 78 }

この例では、studentScoresオブジェクトのすべてのキーが文字列型で、値が数字型です。

ユニオン型をキーとして使用

ユニオン型を使用してオブジェクトのキーを制限することもできます。例えば、オブジェクトのキーが特定の文字列である必要がある場合は、次のように定義します:

1
type Role = "admin" | "user" | "guest";
2
3
type RolePermissions = Record<Role, string[]>;
4
5
const permissions: RolePermissions = {
6
admin: ["create", "edit", "delete"],
7
user: ["view", "edit"],
8
guest: ["view"],
9
};
10
11
console.log(permissions);
12
// 出力: { admin: ['create', 'edit', 'delete'], user: ['view', 'edit'], guest: ['view'] }

この例では、RolePermissions型により、permissionsオブジェクトのキーが 'admin''user'、または 'guest' のいずれかであることが保証されます。

オプションプロパティとの組み合わせ

RecordPartial型を組み合わせることで、すべてのプロパティをオプションにすることができます:

1
type PersonInfo = {
2
name: string;
3
age: number;
4
};
5
6
type PartialPersonInfo = Partial<Record<"Alice" | "Bob", PersonInfo>>;
7
8
const partialInfo: PartialPersonInfo = {
9
Alice: { name: "Alice", age: 30 },
10
// Bob の情報はオプション
11
};
12
13
console.log(partialInfo);
14
// 出力: { Alice: { name: 'Alice', age: 30 } }

この例では、Partial<Record<'Alice' | 'Bob', PersonInfo>>がオブジェクト型を定義し、キーが 'Alice' または 'Bob' で、値が PersonInfo 型であることを保証しますが、すべてのプロパティがオプションとなります。

結論

TypeScriptのRecord型は、オブジェクトのキーと値の型を正確に定義する必要があるシーンで、強力で柔軟なツールです。型定義が簡素化され、コードの可読性と安全性が向上します。PartialPickOmitなどの他の型ツールと組み合わせることで、開発者は複雑なデータ構造を容易に処理し、コードの品質と保守性を大幅に向上させることができます。