typescript/switch-exhaustiveness-check 細部にこだわる
機能
このルールは、ユニオン型に対して switch 文を使用する場合、すべての可能性をカバーしている必要があることを要求します。
なぜ問題なのか?
ユニオン型に対して switch 文を使用する際には、すべての可能なケースを処理することが重要です。これはランタイムエラーを回避するために不可欠です。TypeScript は、switch 文が適切に構成されており、TypeScript が分析できる default ケースが含まれている場合にのみ、網羅性(exhaustiveness)を保証できます。
例
このルールに違反する誤ったコードの例:
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 ケースが欠けている
}
}このルールに準拠する正しいコードの例:
type Status = "pending" | "approved" | "rejected";
function handleStatus(status: Status) {
switch (status) {
case "pending":
return "承認待ち";
case "approved":
return "リクエスト承認済み";
case "rejected":
return "リクエスト却下";
}
}
// 網羅性チェックのために `default` ケースを使用する場合
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
網羅的でない switch 文に default ケースを許可するか。 false にすると、default ケースを持たない網羅的な switch 文を必須とします。
considerDefaultExhaustiveForUnions
type: boolean
default: false
ユニオン型に対して default ケースを網羅的と見なすかどうか。 true にすると、すべてのユニオンメンバーを明示的に処理しなくても、default ケースを持つ switch 文は網羅的とみなされます。
defaultCaseCommentPattern
type: string
default ケースのコメント内に一致する正規表現パターン。 このパターンが一致した場合、網羅性チェックが無効になります。 例: "@skip-exhaustive-check" により default: // @skip-exhaustive-check を許可
requireDefaultForNonUnion
type: boolean
default: false
網羅的でないユニオン型に対して switch 文に default ケースを要求するかどうか。 true にすると、網羅的でないユニオン型に対する switch 文は default ケースが必要です。
使用方法
このルールを有効化するには、設定ファイルまたは CLI を使用できます。
{
"rules": {
"typescript/switch-exhaustiveness-check": "error"
}
}oxlint --type-aware --deny typescript/switch-exhaustiveness-check