Skip to content
← Back to rules

typescript/switch-exhaustiveness-check 严格

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

它的作用

当对联合类型进行开关(switch)操作时,该规则要求开关语句必须是完备的。

为什么这是个问题?

当对联合类型进行开关操作时,必须处理所有可能的情况,以避免运行时错误。TypeScript 可以帮助确保完备性,但前提是开关语句的结构正确,并包含一个 TypeScript 能够分析的默认情况(default case)。

示例

此规则的 错误 代码示例:

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 "请求被拒绝";
  }
}

// 或使用默认情况来实现完备性检查
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

是否允许在非完备的开关中使用默认情况。 当设为 false 时,要求开关语句必须是完备的,且不能包含默认情况。

considerDefaultExhaustiveForUnions

type: boolean

default: false

是否将 default 情况视为联合类型的完备情况。 当设为 true 时,即使未显式处理所有联合成员,只要存在 default 情况,也认为该开关是完备的。

defaultCaseCommentPattern

type: string

正则表达式模式,若匹配到默认情况的注释,则会抑制完备性检查。 示例:"@skip-exhaustive-check" 用于允许 default: // @skip-exhaustive-check

requireDefaultForNonUnion

type: boolean

default: false

是否要求在非完备的联合类型开关上必须包含默认情况。 当设为 true 时,非完备的联合类型开关必须包含一个默认情况。

如何使用

要通过配置文件或 CLI 启用 此规则,可以使用:

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

参考资料