switch-exhaustiveness-check
要求 switch-case 语句是穷举的。
在使用 TypeScript 中的联合类型或枚举时,通常希望编写一个 switch
语句,该语句旨在为联合中的每个可能类型或枚举包含一个 case
。但是,如果联合类型或枚举发生变化,很容易忘记修改 case 以考虑任何新类型。
此规则报告当 switch
语句在类型为文字联合或枚举的值上时,如果缺少对这些文字类型中的任何一个的 case,并且没有 default
子句。
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
语句切换到非联合类型(例如number
或string
)并且该switch
语句没有default
情况时报告。因此,通过将此选项设置为true,规则变得更加严格。
这通常是可取的,这样number
和string
开关将受到与其他开关相同的详尽检查。
使用{ 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;
}
在游乐场中打开type Day =
| 'Monday'
| 'Tuesday'
| 'Wednesday'
| 'Thursday'
| 'Friday'
| 'Saturday'
| 'Sunday';
declare const day: Day;
let result = 0;
switch (day) {
case 'Monday':
result = 1;
break;
case 'Tuesday':
result = 2;
break;
case 'Wednesday':
result = 3;
break;
case 'Thursday':
result = 4;
break;
case 'Friday':
result = 5;
break;
case 'Saturday':
result = 6;
break;
case 'Sunday':
result = 7;
break;
}
在游乐场中打开type Day =
| 'Monday'
| 'Tuesday'
| 'Wednesday'
| 'Thursday'
| 'Friday'
| 'Saturday'
| 'Sunday';
declare const day: Day;
let result = 0;
switch (day) {
case 'Monday':
result = 1;
break;
default:
result = 42;
}
在游乐场中打开同样,以下是一些使用枚举的代码示例
- ❌ 不正确
- ✅ 正确(详尽)
- ✅ 正确(默认)
enum Fruit {
Apple,
Banana,
Cherry,
}
declare const fruit: Fruit;
switch (fruit) {
case Fruit.Apple:
console.log('an apple');
break;
}
在游乐场中打开enum Fruit {
Apple,
Banana,
Cherry,
}
declare const fruit: Fruit;
switch (fruit) {
case Fruit.Apple:
console.log('an apple');
break;
case Fruit.Banana:
console.log('a banana');
break;
case Fruit.Cherry:
console.log('a cherry');
break;
}
在游乐场中打开enum Fruit {
Apple,
Banana,
Cherry,
}
declare const fruit: Fruit;
switch (fruit) {
case Fruit.Apple:
console.log('an apple');
break;
default:
console.log('a fruit');
break;
}
在游乐场中打开何时不使用它
如果您不经常switch
到具有许多部分的联合类型或枚举,或者有意省略某些部分,则此规则可能不适合您。
类型检查的lint规则比传统的lint规则更强大,但也需要配置类型检查的lint。如果您在启用类型检查的规则后遇到性能下降,请参阅性能故障排除。