typescript/switch-exhaustiveness-check 严格
它的作用
当对联合类型进行开关(switch)操作时,该规则要求开关语句必须是完备的。
为什么这是个问题?
当对联合类型进行开关操作时,必须处理所有可能的情况,以避免运行时错误。TypeScript 可以帮助确保完备性,但前提是开关语句的结构正确,并包含一个 TypeScript 能够分析的默认情况(default case)。
示例
此规则的 错误 代码示例:
ts
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 情况
}
}此规则的 正确 代码示例:
ts
type Status = "pending" | "approved" | "rejected";
function handleStatus(status: Status) {
switch (status) {
case "pending":
return "等待审批";
case "approved":
return "请求已批准";
case "rejected":
return "请求被拒绝";
}
}
// 或使用默认情况来实现完备性检查
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
是否允许在非完备的开关中使用默认情况。 当设为 false 时,要求开关语句必须是完备的,且不能包含默认情况。
considerDefaultExhaustiveForUnions
type: boolean
default: false
是否将 default 情况视为联合类型的完备情况。 当设为 true 时,即使未显式处理所有联合成员,只要存在 default 情况,也认为该开关是完备的。
defaultCaseCommentPattern
type: string
正则表达式模式,若匹配到默认情况的注释,则会抑制完备性检查。 示例:"@skip-exhaustive-check" 用于允许 default: // @skip-exhaustive-check
requireDefaultForNonUnion
type: boolean
default: false
是否要求在非完备的联合类型开关上必须包含默认情况。 当设为 true 时,非完备的联合类型开关必须包含一个默认情况。
如何使用
要通过配置文件或 CLI 启用 此规则,可以使用:
json
{
"rules": {
"typescript/switch-exhaustiveness-check": "error"
}
}bash
oxlint --type-aware --deny typescript/switch-exhaustiveness-check