ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ESLint default-case 规则详解:强制 switch 语句声明 default 分支

ESLint default-case 规则详解:强制 switch 语句声明 default 分支 ESLint default-case 规则详解强制 switch 语句声明 default 分支【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslintdefault-case是 ESLint 内置的一条suggestion建议类规则核心职责是强制要求代码中所有switch语句都必须包含default分支以此显式表达未命中任何 case 时应该怎么做避免开发者因遗忘而留下未定义行为。本文以本仓库eslint中的规则文档 docs/src/rules/default-case.md 为主体结合 lib/rules/default-case.js 的源码实现与 tests/lib/rules/default-case.js 的测试用例系统讲解该规则的适用场景、判断逻辑、commentPattern配置与禁用时机帮助你在实际项目中正确启用与使用它。规则动机为什么要强制 default 分支在 JavaScript 中switch语句的case分支并不是穷举式的——当表达式的值不匹配任何case时程序会跳过整个switch体而不执行任何逻辑。如果开发者的本意是未匹配时什么都不做这种写法是合理的但问题在于没有default分支时无法从代码上区分有意省略和意外遗忘。部分团队的代码规范要求所有switch语句都必须有default分支即使该分支是空实现也要显式写出来switch (foo) { case 1: doSomething(); break; case 2: doSomething(); break; default: // do nothing }其背后的理念是始终显式声明默认行为应该是什么这样代码阅读者包括未来的自己能清楚地确认开发者不是忘了写默认处理而是有意不处理。另一部分团队则允许省略default但前提是必须用注释说明省略是有意为之例如switch (foo) { case 1: doSomething(); break; case 2: doSomething(); break; // no default }同样这里的意图也是向读者传达开发者明确希望没有默认行为。Rule Details规则如何判定default-case规则的目标就是要求switch语句具备default分支。在省略default的情况下你可以在最后一个case之后添加一条// no default注释来声明有意省略。该注释不区分大小写例如// No Default、// NO DEFAULT均被接受。该规则在仓库中的元信息如下见 lib/rules/default-case.jstype: suggestion属于建议类规则不直接指向运行时错误recommended: false未收录在eslint:recommended推荐配置中需要手动开启messages.missingDefaultCase: Expected a default case.未命中时的报错文案defaultOptions: [{}]默认选项为空对象即不传参也可运行。错误的代码示例以下写法没有default分支、也没有豁免注释会被判定为违规/*eslint default-case: error*/ switch (a) { case 1: /* code */ break; }正确的代码示例以下三种写法均合规显式default分支、// no default小写注释、// No Default任意大小写注释/*eslint default-case: error*/ switch (a) { case 1: /* code */ break; default: /* code */ break; } switch (a) { case 1: /* code */ break; // no default } switch (a) { case 1: /* code */ break; // No Default }Options配置项说明该规则接受一个可选的对象参数其中只有一个属性commentPattern一个正则表达式字符串用于替换默认的注释匹配模式/^no default$/i。当你的团队习惯使用其他措辞如// skip default来表示有意省略时可自定义该模式。commentPattern 用法示例以下配置将豁免注释模式改为^skip\sdefault即注释以skip default开头即可视为有效声明/*eslint default-case: [error, { commentPattern: ^skip\\sdefault }]*/ switch(a) { case 1: /* code */ break; // skip default } switch(a) { case 1: /* code */ break; // skip default case }注意commentPattern是字符串而非字面量正则因此书写时需要在字符串内对反斜杠进行转义如上例中的\\s。规则内部会将其作为正则表达式源码构造。源码级原理规则的执行流程要深入理解default-case的判定边界需要结合其实现代码 lib/rules/default-case.js 来看该规则的整体逻辑非常精炼全部集中在create(context)中返回的SwitchStatement访问器里。默认注释模式的定义第 7 行定义了默认模式常量const DEFAULT_COMMENT_PATTERN /^no default$/iu;注意这里有两个标志i大小写不敏感所以No Default、NO DEFAULT、no dEFAUlt都能命中测试用例 tests/lib/rules/default-case.js 覆盖了这些变体uUnicode 模式确保对多字节字符的正则语义正确。如果配置了commentPattern规则会用new RegExp(options.commentPattern, u)构造新正则见 lib/rules/default-case.js——只保留u标志不再自动附加i因此自定义模式的大小写敏感性取决于你写的模式本身。五个关键判定步骤访问器SwitchStatement(node)lib/rules/default-case.js的执行流程可以拆解为空 switch 直接跳过如果node.cases.length为 0立即return不报错。源码注释解释了原因空switch内部无法便捷地提取注释所以跳过检查测试用例switch (a) { }为 valid。注意switch (a) { // no default }这种带注释的空 switch 也是合法的检测是否含 default 分支通过node.cases.some(v v.test null)判断——在 ESTree AST 中default:分支的test属性为null这是区分default与其他case的判定依据取最后一个 case 的后续注释调用sourceCode.getCommentsAfter(lastCase)获取紧跟最后一个case节点之后的注释然后取其中最后一条comment作为判定对象注释内容匹配对comment.value.trim()去除首尾空白执行commentPattern.test()判定与上报如果没有注释、或注释内容不匹配模式则context.report({ node, messageId: missingDefaultCase })报出Expected a default case.错误。getCommentsAfter 的底层实现sourceCode.getCommentsAfter由 token-store 提供实现在 lib/languages/js/source-code/token-store/index.js它利用向前游标cursors.forward从给定节点或 token 的range[1]结束位置开始收集直接相邻的注释 token 并以出现顺序返回。这意味着规则只关心紧跟在最后一个case后面的注释——隔了其他语句或代码的注释不会被误判为豁免声明。边界行为测试用例揭示的细节测试文件 tests/lib/rules/default-case.js 用大量 valid/invalid 用例锁定了规则的边界行为只取最后一条注释case 1: break; // no default \n // nope是 invalid——最后一条注释是// nope不匹配默认模式前面的// no default无效注释必须紧跟在最后一个 case 之后// no default写在case 1之前switch (a) { // no default \n case 1: break; }是 invalid因为getCommentsAfter取的是最后一个 case 之后的注释位置不对就视为省略未声明块注释同样有效/* no default */与// no default效果一致源码对注释类型不敏感只取value匹配的是 trim 后的内容注释内容的首尾空白会被去除后再测试因此// no default带多余空格也能通过自定义模式不匹配即报错配置commentPattern: skipped default case时// no default反而会触发missingDefaultCase——自定义模式是完全替换默认模式而非叠加。与 no-fallthrough 的互补关系规则文档 front matter 中声明了关联规则no-fallthrough见 docs/src/rules/default-case.md。default-case关注的是是否有默认分支而no-fallthrough文档见 docs/src/rules/no-fallthrough.md关注的是case 之间是否发生非预期的贯穿fallthrough。两者分别从分支完整性和分支终止性两个维度约束switch在实际项目中常搭配使用default-case强制声明默认行为no-fallthrough强制每个 case 以break、return、throw或注释收尾。When Not To Use It何时关闭该规则如果你不希望强制switch语句必须带default分支可以放心地禁用此规则。典型的适用场景包括团队代码风格接受省略default例如某些 DSL 或状态机代码中switch只用于穷举已知枚举值项目中switch使用极其频繁且大多数场景确实不需要默认行为强制声明会带来大量噪音已有其他约定如代码评审规范来保证default分支不被遗漏无需在 lint 层面强制。由于该规则未被eslint:recommended收录禁用时只需在配置文件中将该规则设为off即可不会影响其他规则。在项目中使用 default-case在扁平配置flat config中启用该规则并自定义豁免注释模式可以参考如下写法仓库自身的 lint 配置见 eslint.config.jsexport default [ { rules: { default-case: [error, { commentPattern: ^skip\\sdefault }], }, }, ];在传统.eslintrc配置中则等价于{ rules: { default-case: [error, { commentPattern: ^skip\\sdefault }] } }如果只需要最基本的强制检查直接配置default-case: error即可此时豁免注释必须匹配默认模式/^no default$/iu。该规则在规则索引 lib/rules/index.js 中以懒加载方式注册与仓库内其他 300 余条内置规则保持一致的加载机制。总结default-case是一条轻量但实用的建议类规则通过强制switch语句声明default分支或以// no default注释显式声明省略让默认行为成为代码中的一等公民。其判定逻辑简单清晰空 switch 跳过、有default放行、否则校验最后一个 case 后的最后一条注释是否匹配模式。理解它的五个判定步骤与getCommentsAfter的直接相邻语义能帮你精准掌握豁免注释的合法位置避免写出看似豁免实则违规的代码。【免费下载链接】eslintFind and fix problems in your JavaScript code.项目地址: https://gitcode.com/GitHub_Trending/es/eslint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表