Skip to content
← Back to rules

typescript/switch-exhaustiveness-check 細部にこだわる

💭 This rule requires type information.
An auto-fix is available for this rule.

機能

このルールは、ユニオン型に対して switch 文を使用する場合、すべての可能性をカバーしている必要があることを要求します。

なぜ問題なのか?

ユニオン型に対して switch 文を使用する際には、すべての可能なケースを処理することが重要です。これはランタイムエラーを回避するために不可欠です。TypeScript は、switch 文が適切に構成されており、TypeScript が分析できる default ケースが含まれている場合にのみ、網羅性(exhaustiveness)を保証できます。

このルールに違反する誤ったコードの例:

ts
type Status = "pending" | "approved" | "rejected";

function handleStatus(status: Status) {
  switch (status) {
    case "pending":
      return "承認待ち";
    case "approved":
      return "リクエスト承認済み";
    // 'rejected' ケースが欠けている
  }
}

enum Color {
  Red,
  Green,
  Blue,
}

function getColorName(color: Color) {
  switch (color) {
    case Color.Red:
      return "赤";
    case Color.Green:
      return "緑";
    // Color.Blue ケースが欠けている
  }
}

このルールに準拠する正しいコードの例:

ts
type Status = "pending" | "approved" | "rejected";

function handleStatus(status: Status) {
  switch (status) {
    case "pending":
      return "承認待ち";
    case "approved":
      return "リクエスト承認済み";
    case "rejected":
      return "リクエスト却下";
  }
}

// 網羅性チェックのために `default` ケースを使用する場合
function handleStatusWithDefault(status: Status) {
  switch (status) {
    case "pending":
      return "承認待ち";
    case "approved":
      return "リクエスト承認済み";
    case "rejected":
      return "リクエスト却下";
    default:
      const _exhaustiveCheck: never = status;
      return _exhaustiveCheck;
  }
}

enum Color {
  Red,
  Green,
  Blue,
}

function getColorName(color: Color) {
  switch (color) {
    case Color.Red:
      return "赤";
    case Color.Green:
      return "緑";
    case Color.Blue:
      return "青";
    default:
      const _exhaustiveCheck: never = color;
      return _exhaustiveCheck;
  }
}

設定

このルールは、以下のプロパティを持つ設定オブジェクトを受け入れます。

allowDefaultCaseForExhaustiveSwitch

type: boolean

default: true

網羅的でない switch 文に default ケースを許可するか。 false にすると、default ケースを持たない網羅的な switch 文を必須とします。

considerDefaultExhaustiveForUnions

type: boolean

default: false

ユニオン型に対して default ケースを網羅的と見なすかどうか。 true にすると、すべてのユニオンメンバーを明示的に処理しなくても、default ケースを持つ switch 文は網羅的とみなされます。

defaultCaseCommentPattern

type: string

default ケースのコメント内に一致する正規表現パターン。 このパターンが一致した場合、網羅性チェックが無効になります。 例: "@skip-exhaustive-check" により default: // @skip-exhaustive-check を許可

requireDefaultForNonUnion

type: boolean

default: false

網羅的でないユニオン型に対して switch 文に default ケースを要求するかどうか。 true にすると、網羅的でないユニオン型に対する switch 文は default ケースが必要です。

使用方法

このルールを有効化するには、設定ファイルまたは CLI を使用できます。

json
{
  "rules": {
    "typescript/switch-exhaustiveness-check": "error"
  }
}
bash
oxlint --type-aware --deny typescript/switch-exhaustiveness-check

参照情報