0Pricing
TypeScript Academy · レッスン

網羅的なswitchとneverチェック

switchでunionを網羅的に処理し、neverで抜けているケースを検出して、安全なassertNeverヘルパーを作ります

「網羅的なswitchとneverチェック」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全3レッスンが含まれています。

導入

目標:ユニオンに対する網羅的なswitchと、neverを使ってコンパイル時に未処理のケースを検出する方法を学びます。

網羅的なswitch

判別可能なユニオンでは、共通のkindフィールドを使います。そのフィールドに対するswitchによって、各ケースを安全に絞り込めます。

type Circle = { kind: "circle"; radius: number }
type Square = { kind: "square"; size: number }
type Shape = Circle | Square

function area(s: Shape): number {
  switch (s.kind) {
    case "circle":
      return Math.PI * s.radius * s.radius
    case "square":
      return s.size * s.size
  }
}

ユニオンが増えた場合

新しいメンバー(例:triangle)が追加されると、neverによってそれを検出できます。そのため、処理し忘れたケースが気付かないうちにバグを生むことを防げます。

type Triangle = { kind: "triangle"; base: number; height: number }
// If we extend Shape but forget to add case, we want a compile-time error
// type Shape = Circle | Square | Triangle

assertNever

assertNeverの引数はnever型でなければなりません。そのため、新しいバリアントがdefaultに入るとコンパイルエラーになります。

function assertNever(x: never): never {
  throw new Error(`Unhandled case: ${String(x)}`)
}

function areaSafe(s: Shape): number {
  switch (s.kind) {
    case "circle":
      return Math.PI * s.radius * s.radius
    case "square":
      return s.size * s.size
    default:
      return assertNever(s) // if Shape grows, compiler errors here
  }
}

リテラルユニオン

同じパターンは文字列リテラルユニオンにも適用できます。すべての値を網羅し、defaultでassertNeverを呼び出します。

type Status = "idle" | "loading" | "success" | "error"

function toIcon(s: Status) {
  switch (s) {
    case "idle": return "⏸"
    case "loading": return "⏳"
    case "success": return "✅"
    case "error": return "⚠️"
    default: return assertNever(s)
  }
}

// Alternative: const check
const _check: never = ((): Status => "idle")() as never // force compile-time check with care

ヒント

ヒント:noFallthroughCasesInSwitchを有効にし、判別可能なユニオンを優先します。defaultはassertNeverのためだけに使います。

// Tips
// - Enable noFallthroughCasesInSwitch in tsconfig for safer switches
// - Prefer discriminated unions over boolean flags
// - Keep default branch only to call assertNever; avoid swallowing cases

assertNeverのチェック

クイックチェック:網羅的なswitchでassertNeverを使う目的は何でしょうか。

まとめ

まとめ:判別可能なユニオンと網羅的なswitchを組み合わせると、より安全なコードになります。neverとassertNeverによって、未処理のケースをコンパイル時に検出できます。

よくある質問

「網羅的なswitchとneverチェック」レッスンは無料ですか?

はい。「網羅的なswitchとneverチェック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全3レッスンが含まれています。

「網羅的なswitchとneverチェック」で何を学びますか?

switchでunionを網羅的に処理し、neverで抜けているケースを検出して、安全なassertNeverヘルパーを作ります ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「網羅的なswitchとneverチェック」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. 網羅的なswitchとneverチェック
  2. Predicate関数とsatisfies演算子
  3. 関数の境界をまたぐunionの絞り込み
← TypeScript Academyに戻る