網羅的な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 | TriangleassertNever
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 casesassertNeverのチェック
クイックチェック:網羅的な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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 網羅的なswitchとneverチェック
- Predicate関数とsatisfies演算子
- 関数の境界をまたぐunionの絞り込み