0Pricing
TypeScript Academy · レッスン

neverによる網羅性チェック

neverを使ってユニオンのすべてのケースが処理されることを確認します。

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

はじめに

網羅性チェックでは `never` 型を使って、ユニオンのすべてのケースが処理されていることを保証します。新しいユニオンメンバーを追加すると、TypeScript がコードのどこを更新すべきか正確に知らせてくれます。

網羅性の問題

ユニオン型で switch を使うときにケースを処理し忘れても、JavaScript は暗黙的に次の処理へ進みます。TypeScript では never チェックによってこれを検出できます。
type Shape = 'circle' | 'square';
function area(s: Shape): number {
  if (s === 'circle') return 3.14;
  if (s === 'square') return 1;
  // What if we add 'triangle'?
}

neverによる網羅性パターン

残りの値を`never`に割り当てます。TypeScriptが`never`以外の型を推論した場合は、未処理のケースがあることを意味します。
function assertNever(x: never): never {
  throw new Error('Unexpected value: ' + x);
}
function area(s: Shape): number {
  switch (s) {
    case 'circle': return 3.14;
    case 'square': return 1;
    default: return assertNever(s);
  }
}

ユニオン型メンバーの追加

Shapeユニオンに'triangle'を追加すると、TypeScriptは`assertNever(s)`の箇所で、新しいケースを処理するようコンパイルエラーを出します。
type Shape = 'circle' | 'square' | 'triangle';
// Now TypeScript errors on assertNever(s) because s is 'triangle'
// — it's not never!

インラインでのneverチェック

ヘルパー関数を使わずに、インラインで網羅性をチェックすることもできます。
function handle(shape: Shape): string {
  switch (shape.kind) {
    case 'circle': return 'circle';
    case 'square': return 'square';
    default:
      const _: never = shape; // Error if not exhaustive
      throw new Error('Unknown shape');
  }
}

switchを使わない網羅性チェック

同じ手法をif/elseチェーンでも使用できます。
function process(action: Action): void {
  if (action.type === 'A') { /* ... */ }
  else if (action.type === 'B') { /* ... */ }
  else {
    const _: never = action; // exhaustive
  }
}

ジェネリック型制約におけるnever

neverはボトム型であり、条件型で実行不可能な分岐を表すのに役立ちます。
type NonNullable<T> = T extends null | undefined ? never : T;
// Removes null and undefined from T

実行不可能な状態へのneverの利用

neverは、型システム上で実行不可能であるべき状態をモデル化するのに役立ちます。
type State<T> =
  | { kind: 'loading' }
  | { kind: 'success'; data: T }
  | { kind: 'error'; msg: string };
// There should never be a state with kind: 'unknown'

条件型におけるnever

neverは、不要な型メンバーを除外するために条件型で使用されます。
type NonFunctions<T> = {
  [K in keyof T]: T[K] extends Function ? never : K
}[keyof T];
// Returns keys whose values are not functions

ユニオン型ではneverが伝播する

neverはユニオン型における恒等元です — T | never = T。
type T = string | never; // string
type U = never | number | never; // number

assertNeverヘルパー

シンプルなassertNeverユーティリティは、網羅性チェックのためにすべてのTypeScriptプロジェクトに用意しておくべきものです。
function assertNever(value: never, message?: string): never {
  throw new Error(message ?? `Unhandled: ${JSON.stringify(value)}`);
}

確認問題

`s`にまだ未処理の型が含まれている場合、`default: assertNever(s)`の行では何が起こりますか?

まとめ

switchのdefaultケースでassertNever(x: never)を使用すると、ユニオンメンバーが処理されていない場合にコンパイルエラーが発生します。これにより、時間の経過とともにユニオンが拡張されてもコードの正しさが保たれます。

よくある質問

「neverによる網羅性チェック」レッスンは無料ですか?

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

「neverによる網羅性チェック」で何を学びますか?

neverを使ってユニオンのすべてのケースが処理されることを確認します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「neverによる網羅性チェック」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. typeofと真偽値によるナローイング
  2. instanceofとinによるナローイング
  3. ユーザー定義型ガード関数
  4. neverによる網羅性チェック
← TypeScript Academyに戻る