TypeScript Academy · レッスン

判別可能ユニオンによる網羅的なエラー処理

switch+never、ヘルパーユーティリティ、コンパイル時の網羅性チェックを使って、モジュール全体の判別可能ユニオンを網羅的に処理するハンドラーを記述します。

レッスン 2/28 ステップ

「判別可能ユニオンによる網羅的なエラー処理」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Result/Eitherスタイルの型
  2. 判別可能ユニオンによる網羅的なエラー処理
← TypeScript Academyに戻る