typescript/switch-exhaustiveness-check Pedantic
What it does
This rule requires switch statements to be exhaustive when switching on union types.
Why is this bad?
When switching on a union type, it's important to handle all possible cases to avoid runtime errors. TypeScript can help ensure exhaustiveness, but only if the switch statement is properly structured with a default case that TypeScript can analyze.
Examples
Examples of incorrect code for this rule:
ts
type Status = "pending" | "approved" | "rejected";
function handleStatus(status: Status) {
switch (status) {
case "pending":
return "Waiting for approval";
case "approved":
return "Request approved";
// Missing 'rejected' case
}
}
enum Color {
Red,
Green,
Blue,
}
function getColorName(color: Color) {
switch (color) {
case Color.Red:
return "red";
case Color.Green:
return "green";
// Missing Color.Blue case
}
}
Examples of correct code for this rule:
ts
type Status = "pending" | "approved" | "rejected";
function handleStatus(status: Status) {
switch (status) {
case "pending":
return "Waiting for approval";
case "approved":
return "Request approved";
case "rejected":
return "Request rejected";
}
}
// Or with default case for exhaustiveness checking
function handleStatusWithDefault(status: Status) {
switch (status) {
case "pending":
return "Waiting for approval";
case "approved":
return "Request approved";
case "rejected":
return "Request rejected";
default:
const _exhaustiveCheck: never = status;
return _exhaustiveCheck;
}
}
enum Color {
Red,
Green,
Blue,
}
function getColorName(color: Color) {
switch (color) {
case Color.Red:
return "red";
case Color.Green:
return "green";
case Color.Blue:
return "blue";
default:
const _exhaustiveCheck: never = color;
return _exhaustiveCheck;
}
}
How to use
To enable this rule in the CLI or using the config file, you can use:
bash
oxlint --deny typescript/switch-exhaustiveness-check
json
{
"rules": {
"typescript/switch-exhaustiveness-check": "error"
}
}