跳至主要内容

switch-exhaustiveness-check

要求 switch-case 语句是穷举的。

💡

此规则报告的一些问题可以通过编辑器手动修复 建议

💭

此规则需要 类型信息 才能运行。

在使用 TypeScript 中的联合类型或枚举时,通常希望编写一个 switch 语句,该语句旨在为联合中的每个可能类型或枚举包含一个 case。但是,如果联合类型或枚举发生变化,很容易忘记修改 case 以考虑任何新类型。

此规则报告当 switch 语句在类型为文字联合或枚举的值上时,如果缺少对这些文字类型中的任何一个的 case,并且没有 default 子句。

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/switch-exhaustiveness-check": "error"
}
};

在游乐场中尝试此规则 ↗

选项

此规则接受以下选项

type Options = [
{
/** If 'true', allow 'default' cases on switch statements with exhaustive cases. */
allowDefaultCaseForExhaustiveSwitch?: boolean;
/** If 'true', require a 'default' clause for switches on non-union types. */
requireDefaultForNonUnion?: boolean;
},
];

const defaultOptions: Options = [
{
allowDefaultCaseForExhaustiveSwitch: true,
requireDefaultForNonUnion: false,
},
];

allowDefaultCaseForExhaustiveSwitch

默认为 true。如果设置为 false,此规则还会报告当 switch 语句对联合中的所有内容都有一个 case,并且包含一个 default case 时。因此,通过将此选项设置为 false,规则变得更加严格。

switch 语句在联合类型上是穷举的时,最终的 default case 将是一种死代码的形式。此外,如果向联合类型添加了新值,default 将阻止 switch-exhaustiveness-check 规则报告 switch 语句中未处理的新 case。

allowDefaultCaseForExhaustiveSwitch 注意事项

如果在穷举的 switch 语句上包含一个冗余的 default case 有时可能很有用,如果值可能具有联合类型未表示的类型。例如,在客户端和服务器之间可能存在版本不匹配的应用程序中,服务器运行较新的软件版本可能会发送客户端较旧类型无法识别的值。

如果您的项目有少量故意冗余的 default case,您可能希望对每个 case 使用 内联 ESLint 禁用注释

如果您的项目包含许多有意冗余的default情况,您可能需要禁用allowDefaultCaseForExhaustiveSwitch并使用default-case核心ESLint规则以及satisfies never检查

requireDefaultForNonUnion

默认值为false。如果设置为true,此规则还会在switch语句切换到非联合类型(例如numberstring)并且该switch语句没有default情况时报告。因此,通过将此选项设置为true,规则变得更加严格。

这通常是可取的,这样numberstring开关将受到与其他开关相同的详尽检查。

使用{ requireDefaultForNonUnion: true }时,此规则的额外不正确代码示例

const value: number = Math.floor(Math.random() * 3);

switch (value) {
case 0:
return 0;
case 1:
return 1;
}
在游乐场中打开

由于value是非联合类型,因此它要求switch语句仅在启用requireDefaultForNonUnion的情况下具有默认子句。

示例

当switch没有详尽的case时,要么全部填写它们,要么添加一个default将纠正规则的抱怨。

以下是一些使用文字联合的代码示例

type Day =
| 'Monday'
| 'Tuesday'
| 'Wednesday'
| 'Thursday'
| 'Friday'
| 'Saturday'
| 'Sunday';

declare const day: Day;
let result = 0;

switch (day) {
case 'Monday':
result = 1;
break;
}
在游乐场中打开

同样,以下是一些使用枚举的代码示例

enum Fruit {
Apple,
Banana,
Cherry,
}

declare const fruit: Fruit;

switch (fruit) {
case Fruit.Apple:
console.log('an apple');
break;
}
在游乐场中打开

何时不使用它

如果您不经常switch到具有许多部分的联合类型或枚举,或者有意省略某些部分,则此规则可能不适合您。


类型检查的lint规则比传统的lint规则更强大,但也需要配置类型检查的lint。如果您在启用类型检查的规则后遇到性能下降,请参阅性能故障排除

资源