跳過主內容

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 型態 (例如 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 是非聯合類型,因此在啟用 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;
}
在遊樂場中開啟

類似地,以下是一些使用枚舉的程式碼範例

enum Fruit {
Apple,
Banana,
Cherry,
}

declare const fruit: Fruit;

switch (fruit) {
case Fruit.Apple:
console.log('an apple');
break;
}
在遊樂場中開啟

什麼時候不使用

如果您不常在具有許多部分的聯合類型或枚舉上使用 switch,或故意想略過一些部分,則這項規則可能不適合您。


型態檢查的程式碼檢查規則比傳統的程式碼檢查規則更強大,但也需要設定型態檢查程式碼檢查。如果您在啟用型態檢查規則之後遇到效能下降,請參閱效能問題處理

資源