如何配置ESLint规则要求每行仅放置一个独立变量声明语句
强制每个var/let/const声明单独占一行的ESLint配置方案
现有规则不生效的原因
你之前配置的三个规则不符合需求的核心原因如下:
one-var、one-var-declaration-per-line:这两个规则仅约束单个声明关键字下通过逗号分隔的多变量声明(比如let a = 1, b = 2这种写法),无法识别同一行内多个独立的、用分号分隔的var/let/const声明语句,因此对你给出的第一行错误代码不会触发校验。max-statements-per-line:默认配置下会统计同一行内所有层级的语句数量,不区分语句是在当前块顶层还是嵌套在函数、类等表达式内部,因此会把第二行代码里函数体内的console.log也计入语句数,导致误报。
精准满足需求的配置
不需要安装额外插件,通过给max-statements-per-line添加忽略节点配置,配合原有两个规则即可完全实现你要的效果:允许单行单变量声明(哪怕赋值为带单行内容的函数表达式),禁止同一行写多个独立变量声明。
完整.eslintrc配置如下:
{ "rules": { "one-var": ["error", "never"], "one-var-declaration-per-line": ["error", "always"], "max-statements-per-line": [ "error", { "max": 1, "ignoredNodes": [ "FunctionExpression > BlockStatement > :first-child:last-child", "ArrowFunctionExpression > BlockStatement > :first-child:last-child" ] } ] } }
配置效果验证
对你给出的测试代码,校验结果完全符合预期:
- 第一行
let foo: string; let bar: string;:同一行存在两个独立的顶层变量声明语句,总语句数为2,会被规则标记为错误。 - 第二行
let blah = function blah() { console.log('woot'); };:仅存在1个顶层变量声明语句,函数体内的console.log是函数块内唯一的语句,匹配忽略规则不计入统计,不会被标记为错误。
其他常见场景的校验表现:
- 逗号分隔的多变量声明(如
let a = 1, b = 2)会被one-var规则拦截报错 - 函数体内同一行写多个语句(如
const fn = () => { a(); b() })会被正常拦截报错 - 单行箭头函数简写(如
const double = n => n * 2)无额外嵌套语句节点,不会被误报 - 单行非变量声明语句(如
arr.push(1))符合单语句要求,不会被拦截
内容的提问来源于stack exchange,提问作者drwestco
相关产品推荐
相关产品推荐

