【TypeScript】Mapped typeを活用して拡張性の高いコードを書く
はじめに
TypeScript+Reactなどの環境で、コンポーネントのタイプによって背景色や文字色などを切り替えたいとき、Mapped typeを使うと拡張性のある実装を行うことができるよ!という話です。
こちらTypeScript初心者向けの記事になりますので、もっと基礎向けの内容も知りたいという方は以下の記事もご覧ください。
実装
背景色や文字色を"WARNING"と"DANGER"の2パターン用意したいとき、三項演算子を使えば以下のように書くことができます。
const backgroundColor = type === "WARING" ? "yellow" : "red";
const color = type === "WARING" ? "white" : "black";
しかし、今後"NORMAL"というパターンも用意しなければいけなくなったとき、三項演算子を使うことはできなくなります。
機能拡張のために、if
やswitch
を使った実装変更を行う必要がでてきてしまいます。
パターンを1つ増やすだけでこのような実装変更を行う必要があるのは、決して拡張性の高いコードとはいえません。
このときに利用するのがMapped typeです。
type AttentionType = "WARNING" | "DANGER";
type AttentionTheme = {
backgroundColor: string;
color: string;
};
const AttentionThemeMap: { [key in AttentionType]: AttentionTheme } = {
WARNING: {
backgroundColor: "yellow",
color: "white",
},
DANGER: {
backgroundColor: "red",
color: "black",
},
};
AttentionType
で必要なパターンをユニオンリテラル型で定義し、AttentionTheme
で各パターンにおけるオブジェクトのプロパティの型を定義します。
すると、AttentionThemeMap: { [key in AttentionType]: AttentionTheme }
のようなMapped typeを定義することができます。
各パターンにおけるbackgroundColor
やcolor
を以下のように取得することができるのですが、type
がAttentionType
("WARNING"と"DANGER")以外だと、TypeScriptが赤波線でエラーを出して注意してくれます。
const { backgroundColor, color } = AttentionThemeMap[type]
また、"NORMAL"のような新しいパターンを追加したいとき、必要なのはAttentionType
とAttentionThemeMap
への簡単なコード追加のみとなります。
type AttentionType = "WARNING" | "DANGER" | "NORMAL";
const AttentionThemeMap: { [key in AttentionType]: AttentionTheme } = {
WARNING: {
backgroundColor: "yellow",
color: "white",
},
DANGER: {
backgroundColor: "red",
color: "black",
},
NORMAL: {
backgroundColor: "green",
color: "white",
},
};
条件変更をif
やswitch
頼みにすると、コードの可読性も下がってしまいます。
明日からMapped typeを使ってみましょう!
参考資料
Author And Source
この問題について(【TypeScript】Mapped typeを活用して拡張性の高いコードを書く), 我々は、より多くの情報をここで見つけました https://qiita.com/suzuki0430/items/38cef82ca40e43647b19著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .