switch-exhaustiveness-check
要求 switch-case 陳述式必須窮舉。
來執行。
使用 TypeScript 中的聯合類型或枚舉時,通常需要撰寫 switch
陳述式,此陳述式旨在針對聯合或枚舉中的每種類型包含一個 case
。不過,如果聯合類型或枚舉有所變更,很容易忘記修改 case 以說明任何新類型。
switch
陳述式時,卻遺漏對任何一種字面值類型提供 case,或者沒有 default
子句,此時此規則會回報。module.exports = {
"rules": {
"@typescript-eslint/switch-exhaustiveness-check": "error"
}
};
.eslintrc.cjs
在遊樂場中嘗試此規則 ↗
選項
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
陳述式對於 union 中的所有內容都有案例,且包含 default
案例時,此規則也會回報。因此,透過將此選項設為 false,規則將會更嚴格。
當 switch
陳述式經過 union 型態後是窮舉時,最後的 default
案例將會是 dead code 的形式。此外,如果向 union 型態新增新值,則 default
會阻止 switch-exhaustiveness-check
規則回報未在 switch
陳述式中處理的新案例。
allowDefaultCaseForExhaustiveSwitch
注意事項
如果可能的值具有未由 union 型態表示的型態,則有時在窮舉 switch
陳述式上包含備援 default
案例會很有用。例如,在用戶端和伺服器之間可能存在版本不符的應用程式中,執行較新軟體版本的伺服器可能發送未由用戶端的較舊型別辨識的值。
如果您的專案有少數的故意備援 default
案例,您可能想要為每個案例都使用 內嵌 ESLint 停用註解。
如果您的專案有許多故意備援 default
案例,您可能想要停用 allowDefaultCaseForExhaustiveSwitch
,然後使用 default-case
核心 ESLint 規則,以及 滿足 never 檢查。
requireDefaultForNonUnion
預設為 false。如果設為 true,則當 switch
陳述式切換非 union 型態 (例如 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
是非聯合類型,因此在啟用 requireDefaultForNonUnion
時,它需要 switch 範例只有一個預設子句。
範例
當 switch 沒有窮盡範例時,填補所有範例或新增預設將修正這項規則的抱怨。
以下是使用字面值的聯合運算範例
- ❌ 錯誤
- ✅ 正確(窮盡)
- ✅ 正確(預設)
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
,或故意想略過一些部分,則這項規則可能不適合您。
型態檢查的程式碼檢查規則比傳統的程式碼檢查規則更強大,但也需要設定型態檢查程式碼檢查。如果您在啟用型態檢查規則之後遇到效能下降,請參閱效能問題處理。