TypeScript の Record の使い方

2020-08-01

TypeScript の Handbook には以下の Utility Types が書かれています。

  • Partial
  • Readonly
  • Record
  • Pick
  • Omit
  • Exclude
  • Extract
  • NonNullable
  • Parameters
  • ConstructorParameters
  • ReturnType
  • InstanceType
  • Required
  • ThisParameterType
  • OmitThisParameter
  • ThisType

で、そのうち自分が未だに理解できていないのが以下の通りでして。

  • Record
  • ConstructorParameters
  • InstanceType
  • ThisParameterType
  • OmitThisParameter
  • ThisType

このうち最低でも Record はしっかりと仕様を覚えないとマズいよなぁと思いつつ数年、どうやって使うのが効果的なのかわからないままでした。

で、さっきコーディングをしていて、ふと突然 Record の使い方の一つが理解できたので備忘録がてら。

まず、今まで書いていたコードがこれです。

export type SetSitePayload = {
  [key in
    | "ajinomoto"
    | "cookpad"
    | "delishkitchen"
    | "erecipe"
    | "kikkoman"
    | "kurashiru"
    | "lettuceclub"
    | "nadia"
    | "orangepage"
    | "rakuten"
    | "sirogohan"]: boolean;
};

きったねーですね、自分も書いていて『もう少しなんとかならんのか』と思っていました。

対して Record を使った場合がこんな感じです。

type Site =
  | "ajinomoto"
  | "cookpad"
  | "delishkitchen"
  | "erecipe"
  | "kikkoman"
  | "kurashiru"
  | "lettuceclub"
  | "nadia"
  | "orangepage"
  | "rakuten"
  | "sirogohan";

export type SetSitePayload = Record<Site, boolean>;

めっちゃ綺麗ですね、すごく良い感じです。

ということで Record の使いみちとしては、オブジェクトの value が定まっており、その value を複数の key に紐付ける場合に効果を発揮する、という認識になりました。

なかなか使いみちが難しそうな感じを受けますが、どうなんでしょうか。