TypeScriptにおいてnever型を使ってswitch文の網羅性を保証する

union型に対してswich文を使う場合は、網羅性の保証が重要となります。
網羅性の保証方法として、default句にnever型を代入する方法があります。

never型は「値を持たない」を意味するTypeScriptの特別な型です。
詳しくはhttps://typescriptbook.jp/reference/statements/never
簡単に言い換えると「あり得ない」ことを表す型です。

こちらがサンプル実装となります。

type Sample = "A" | "B;
 function testFunc(sample: Sample): void {
   switch (sample) {
     case "A":
       console.log(sample);
       break;
     case "B":
       console.log(sample);
       break;
     default:
        // 網羅性をチェック
       const _: never = sample;
   }
 }

このコードがビルドに成功するということはTypeScriptの型検査器によって「このdefault節が実行されることはあり得ない」と結論付けられたということを意味しています。つまり、全てのパターンが網羅されているということになります。 (たとえば、 case “B”:のコードを消すとエラーになります。)

この方法を取ることにより、Union型のすべてのパターンに対して漏れなく処理が書かれていることを保証することができます。 将来Union型に新しい型が追加されたときに、それに対応する処理が書かれていることを保証することができます。

参考

Tags: