どの言語にも存在する switch-case 文。
引数に 1 つの変数を取るものが多いので、文字列連結させて無理やり条件を作っちゃうってこともありますよね。
逃げの手というか・・・。
中には Kotlin の when ように、条件設定が柔軟にできるものもあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | val hoge = "hoge" val fuga = "fuga" when (hoge) { "hoge" -> { println("match.") } else -> { println("not match.") } } when { hoge == "hoge" && fuga == "fuga" -> { println("match.") } else -> { println("not match.") } } |

今回は、TypeScript で 2 つの条件で switch 文が使えないか調べてみたので紹介します。
TypeScriptに入門してみる
ここ数年、人気爆発中の TypeScript。
サーバーサイドで NodeJS、フロントエンドで JavaScript みたいなプロジェクトなら乗り換えたくなりますよね。
しかしサーバサイドで別のプログラム言語を使っていたら、わざわざ JS の世界に飛び込まなくても・・・。
って思っていたのですが、慣れてくると少しずつ楽しくなってきました。
とりあえず入門編として「サバイバルTypeScript」を紹介しておきます。
大型書店で TypeScript の入門書を探したのですが、なかなか良さそうな本が見つからなかったのですよね。
オライリー本はいまだに苦手で・・・。
あとは Web 上で TypeScript の実行確認ができるサイト。
switchで複数条件
さて、本題に戻ります。
switch 文のドキュメントやリファレンスを見ても引数は 1 つだけのようです。
if を使うなり、別の方法を検討しなければいけないかと思ったのですが、case に関数が使えるようです。
booleanが戻り値の関数
上記サイトを参考に、地域(エリア)とステージ(本番、テスト)の環境別にドメインを割り出す条件式を定義してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | interface Env { readonly area: string; readonly stage: string; } function getDomain(env: Env): string { const match = (e: Env, area: string, stage: string): boolean => { return e.area === area && e.stage === stage; } switch (true) { case match(env, "jp", "test"): return "jp-test.example.com"; case match(env, "jp", "prod"): return "jp-prod.example.com"; case match(env, "us", "test"): return "us-test.example.com"; case match(env, "us", "prod"): return "us-prod.example.com"; } throw new Error(`Not Match. ${env.area}, ${env.stage}`); } const domain = getDomain({ area: "jp", stage: "test" }); console.log("domain: " + domain); |
上記の実行結果は以下の通り。
[LOG]: “domain: jp-test.example.com”
match という関数を定義し、env の中身と area, stage が一致すれば true を返します。
switch の引数を true にしておけば、関数の戻り値が true の時にマッチという感じです。
numberが戻り値の関数
もちろん、関数の戻り値が number 型であれば、switch の引数も number 型の変数や数値を指定すれば OK。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | const matchNum = (a: number, b: number): number => { return a + b; } switch (100) { case matchNum(10, 90): console.log("match."); break; default: console.log("not match."); break; } const num = 200; switch (num) { case matchNum(10, 90): console.log("match."); break; default: console.log("not match."); break; } |
上記の実行結果は以下の通り。
[LOG]: “match.”
[LOG]: “not match.”
まとめ
TypeScript の switch 文で複数の条件を判定に使う方法を紹介してきました。
今回の実装がベストかどうかはわかりませんが、柔軟な対応ができそうで悪くありません。
また、JavaScript っぽい実装なのかなっとも思います。
まだまだ慣れない部分も多い TypeScript なので、ノウハウを蓄積していきたいところです。