ChatGPTにコードを書いてもらっていると知らない書き方と出会うことができ、勉強になる。

ChatGPTに書いてもらうことは悪いことばかりじゃないと最近は思うようにしている。

ちょっと前までは反骨心から使ってなかったけど、そう思うようになってからはどんどん活用している。

ただChatGPTを使って学習したことを活用する機会はChatGPTに奪われているけど。

Recordってなに

そんなChatGPTが提案してきたコードにRecordという型があったので、どういう型なのか調べてみた。

Record<Keys, Type>はプロパティのキーがKeysであり、プロパティの値がTypeであるオブジェクトの型を作るユーティリティ型です。

とのこと。

例えば、キーがstringで値がnumberのインデックス型を定義するには、

type StringNumber = Record<string, number>;
const value: StringNumber = { a: 1, b: 2, c: 3 };

キーがfirstNamemiddleNamefamilyNameで、値が文字列になるオブジェクトの型を定義するには、

type Person = Record<"firstName" | "middleName" | "lastName", string>;
const person: Person = {
  firstName: "Robert",
  middleName: "Cecil",
  lastName: "Martin",
};

こんな感じで使用することができる。

ただ、2つ目の例のようにKeyが確定している型に関しては

interface Person {
  firstName: string;
  middleName: string;
  lastName: string;
}

と何が違うのか。

結果的には同じ構造

上記だと同様の型定義になる。

ただinterface のほうが拡張性が高く、Recordのほうが簡潔に書けるけど、具体的なプロパティ名や構造を明示しにくいとのこと。

じゃあ、Recordはいつ使うのか。

Recordの使い道

  1. Record は多くのキーが同じ型を持つ場合、簡潔に型を定義する時
type WeeklySchedule = Record<"Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday", string>;
  1. 動的なキーの集合に対して一律の型を定義したい時
type ApiResponse<T> = Record<string, T>;

こんな感じで動的なキーの型付けや簡潔なオブジェクト型定義が必要なときに使えるらしい。