レコード型を活用したTypeScriptの効率的なマッピング

レコード型を活用したTypeScriptの効率的なマッピング

TypeScriptのレコード型(Record型)は、特定のキーに対して値の型を割り当てる強力なツールです。これにより、オブジェクトのキーとその型を動的に管理することができます。本記事では、レコード型を使って効率的にマッピングを行う方法について詳しく説明します。

レコード型とは?

レコード型は、TypeScriptのユーティリティ型の一つで、キーを指定し、そのキーに対応する型を定義することができます。キーの型として文字列や文字列リテラルを指定し、値の型として任意の型を指定することができます。

type MyRecord = Record<string, number>;

const recordExample: MyRecord = {
    "apple": 10,
    "banana": 20
};

基本的な構文

レコード型は次のように使用します。最初の型引数でキーの型を指定し、2番目の型引数で値の型を指定します。

type FruitCounts = Record<string, number>;

const fruits: FruitCounts = {
    "apple": 5,
    "banana": 8
};

文字列リテラルをキーにする

レコード型では、キーに文字列リテラルを使用することができます。これにより、指定したキーのみが許可される型を定義できます。

type FruitPrice = Record<'apple' | 'banana', number>;

const fruitPrices: FruitPrice = {
    apple: 1.5,
    banana: 0.75
};

// fruitPrices.orange = 1.0; // エラー: 'orange' は型 'FruitPrice' に存在しません

異なる型の値を持つレコード

レコード型は、複数の異なる型を値として持つことも可能です。例えば、文字列型と数値型のレコードを定義できます。

type MixedRecord = Record<'name' | 'age', string | number>;

const person: MixedRecord = {
    name: "Alice",
    age: 30
};

動的なキーを持つレコード

レコード型は、動的に生成されるキーにも対応可能です。例えば、任意の文字列をキーにして、それに対する値の型を指定することができます。

type DynamicRecord = Record;

const dynamicData: DynamicRecord = {
"isActive": true,
"isVerified": false
};

マッピングを利用した型の変換

レコード型を活用すると、型を変換したり、型の一部を変更したりする際に非常に有効です。例えば、すべての値を文字列型に変換することも可能です。

type DynamicRecord = Record<string, boolean>;

const dynamicData: DynamicRecord = {
    "isActive": true,
    "isVerified": false
};

レコード型を用いたオブジェクトの選択的な部分更新

レコード型を使って、オブジェクトの一部のプロパティを動的に更新することができます。これにより、変更が必要な部分だけを効率的に管理できます。

type NumericRecord = Record<'key1' | 'key2', number>;
type StringRecord = { [K in keyof NumericRecord]: string };

const stringRecord: StringRecord = {
    key1: "10",
    key2: "20"
};

マッピングされたレコード型のバリエーション

レコード型を使用すると、同じ構造を持つ複数の型を動的に定義できます。たとえば、マッピングを使って異なる種類のデータを処理することができます。

type UserStatus = Record<'active' | 'inactive', boolean>;

const statusUpdate: UserStatus = {
    active: true,
    inactive: false
};

// statusUpdate.deleted = true; // エラー: 'deleted' は型 'UserStatus' に存在しません

レコード型と関数型の組み合わせ

レコード型は関数型と組み合わせて使用することも可能です。たとえば、関数をマッピングして、それぞれのキーに対応する処理を定義できます。

type ProductPrices = Record<'apple' | 'banana' | 'cherry', number>;

const prices: ProductPrices = {
    apple: 1.2,
    banana: 0.8,
    cherry: 2.5
};

レコード型を用いた配列の処理

レコード型は配列型のデータにも適用できます。配列のインデックスに対して動的に型を割り当てることができます。

type IndexRecord = Record;

const list: IndexRecord = {
0: "apple",
1: "banana",
2: "cherry"
};

// list[3] = "date"; // 3番目の要素を追加できます

型の整合性を確保する

レコード型を使用することで、オブジェクトの型が強制され、予期しないキーが追加されるのを防げます。これにより、型の整合性を保つことができます。

type Operations = Record<'add' | 'subtract', (x: number, y: number) => number>;

const operations: Operations = {
    add: (x, y) => x + y,
    subtract: (x, y) => x - y
};

const result = operations.add(5, 3); // 8

レコード型を使ったマッピングのパフォーマンス

レコード型は型の管理を非常に効率的に行うため、パフォーマンスの向上にもつながります。特に大量のデータを扱う場合にその恩恵を受けることができます。

まとめ

レコード型はTypeScriptでデータの構造を効率的に管理するための強力なツールです。動的にプロパティを指定したり、複数の型を組み合わせたりすることができ、柔軟な型設計が可能になります。コードの可読性と保守性が向上し、開発の効率が大幅に改善されるため、レコード型は是非活用すべきです。