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 に紐付ける場合に効果を発揮する、という認識になりました。
なかなか使いみちが難しそうな感じを受けますが、どうなんでしょうか。