Dev Study
← 解説「網羅性チェック — neverで分岐の抜け漏れを防ぐ」に戻る

サンプルコードで身につける: 網羅性チェック — neverで分岐の抜け漏れを防ぐ

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

12択のユニオンをneverで網羅する

網羅性チェックの最小構成です。"on" と "off" を両方 case で処理していれば、default に届く値は存在しないので never への代入が成立します。まずは「全部処理した状態では default が never になる」という感覚をつかむための例です。

TypeScript

2候補が増えたときにエラーで気づける

網羅性チェックの本当の価値は、ユニオンに候補を追加した瞬間に現れます。Season に新しい候補を足すと、case が足りないこの switch では never への代入がコンパイルエラーになり、直すべき場所を教えてくれます。「将来の変更に備えて仕込んでおく」チェックであることを示す例です。

TypeScript

3判別可能ユニオンの網羅性チェック

リテラル型のユニオンだけでなく、kind で判別するオブジェクトのユニオンでも同じ定石が使えます。すべての kind を case で処理していれば default の shape は never になり、新しい図形を追加したときに計算の追加漏れを検出できます。状態やデータの種類が増えていく設計で特に効きます。

TypeScript

4assertNever関数を共通部品にする

never への代入を毎回書く代わりに、never を受け取って必ず throw する assertNever 関数を1つ用意しておく書き方です。コンパイル時は引数が never かどうかで網羅を検査し、万一実行時に想定外の値が来た場合もエラーで止まります。プロジェクト共通のユーティリティとして定義されることが多い形です。

TypeScript

5注文ステータス処理の抜け漏れを防ぐ

ECサイトの注文ステータスのように、業務の都合で候補が増えやすいユニオンこそ網羅性チェックの出番です。キャンセル対応の追加などで OrderStatus に候補を足すと、この switch がエラーになって文言の追加漏れを防げます。状態ごとの表示や通知を扱う実務コードの定番パターンです。

TypeScript