判別可能ユニオンによる網羅的なエラー処理
switch+never、ヘルパーユーティリティ、コンパイル時の網羅性チェックを使って、モジュール全体の判別可能ユニオンを網羅的に処理するハンドラーを記述します。
「判別可能ユニオンによる網羅的なエラー処理」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/2です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全2レッスンが含まれています。
導入
目標:ユニオンのすべてのメンバーが処理されることを保証します。switch + neverと小さなexhaustiveCheckユーティリティを使用し、ファイルをまたいで網羅性を保つ方法を確認します。
- 判別子(tagフィールド)
- 網羅的なswitch
- 早期失敗するデフォルト処理
判別可能なユニオン
判別可能なユニオンには共有のタグ(ここではkind)があります。各バリアントはそれぞれ固有のデータを持ちます。
export type Payment =
| { kind: "Card"; last4: string }
| { kind: "Cash" }
| { kind: "Wire"; iban: string }Switch + never
defaultでpをneverに代入します。後から新しいバリアントを追加すると、処理するまでコンパイラーがエラーを報告します。
export function describe(p: Payment): string {
switch (p.kind) {
case "Card": return `Card ••••${p.last4}`
case "Cash": return "Cash"
case "Wire": return `Wire ${p.iban}`
default: {
const _exhaustive: never = p
return _exhaustive
}
}
}exhaustiveCheck ヘルパー
小さなヘルパーを使用して意図を明確にします。never型のパラメーターによって、未処理のケースが実行時の単なる例外ではなく、型エラーになります。
export function exhaustiveCheck(x: never): never {
throw new Error(`Unhandled case: ${JSON.stringify(x)}`)
}
export function pay(p: Payment): string {
switch (p.kind) {
case "Card": return "charged card"
case "Cash": return "took cash"
case "Wire": return "initiated wire"
default: return exhaustiveCheck(p)
}
}モジュールをまたぐ網羅性
ユニオンを1つのファイルで定義し、別のファイルで処理する場合でも、分岐を追加するとすべてのswitchを更新するまでビルドが失敗します。これはまさに期待する動作です。
// errors.ts
export type AppError =
| { tag: "Auth"; reason: "Unauthorized" | "Forbidden" }
| { tag: "NotFound"; resource: string }
| { tag: "Conflict"; resource: string }
// handler.ts
import type { AppError } from "./errors"
import { exhaustiveCheck } from "./exhaustive"
export function toStatus(e: AppError): number {
switch (e.tag) {
case "Auth": return e.reason === "Unauthorized" ? 401 : 403
case "NotFound": return 404
case "Conflict": return 409
default: return exhaustiveCheck(e)
}
}ヒントと落とし穴
ヒント:
- 文字列リテラルのタグ(例:
tag/kind)を優先します。 - バリアントは小さく保ち、巨大なユニオンではなくネストしたオブジェクトでデータを組み合わせます。
neverガードのないdefaultは決して使用しません。未処理のケースが隠れてしまいます。
網羅性チェック
クイックチェック:すべてのケースを網羅して処理することを保証するものは何ですか?
まとめ
まとめ:判別子を使用してswitchを記述し、default分岐でneverに代入する(またはexhaustiveCheckを呼び出す)ことで、ユニオンの変更後も完全な網羅性を保証します。
AI チューターと学ぶ TypeScript — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 101
- レッスン
- 352
よくある質問
「判別可能ユニオンによる網羅的なエラー処理」レッスンは無料ですか?
はい。「判別可能ユニオンによる網羅的なエラー処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全2レッスンが含まれています。
「判別可能ユニオンによる網羅的なエラー処理」で何を学びますか?
switch+never、ヘルパーユーティリティ、コンパイル時の網羅性チェックを使って、モジュール全体の判別可能ユニオンを網羅的に処理するハンドラーを記述します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/2です。
「判別可能ユニオンによる網羅的なエラー処理」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Result/Eitherスタイルの型
- 判別可能ユニオンによる網羅的なエラー処理