为什么我的自定义ESLint规则无法正确触发?

Code°紫瑶 阅读 12

我在开发一个检查函数参数数量的ESLint插件,规则逻辑写好了但总不生效。比如写个加法函数:add(a, b)应该通过,但调用add(a)时规则没报错。

规则配置是这样的:


module.exports = {
    meta: { ... },
    create(context) {
        return {
            CallExpression(node) {
                if (node.callee.name === 'add' && node.arguments.length !== 2) {
                    context.report({
                        node,
                        message: 'add必须接收两个参数'
                    });
                }
            }
        };
    }
};

测试用例明明符合条件,控制台却没有任何输出。我尝试在回调函数里加console.log('test')调试,发现这个方法根本没被调用过。是不是访问者模式的节点类型写错了?或者需要额外配置什么选项?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
闲人篷蔚
问题出在你的访问者模式节点类型上,CallExpression 没问题,但你漏了配置规则的 meta.schema 和测试环境的规则启用部分。直接复制下面的代码:

module.exports = {
meta: {
type: 'problem',
docs: {
description: '强制 add 函数必须接收两个参数',
category: 'Possible Errors',
recommended: true
},
schema: [] // 确保这里有 schema 字段,即使为空
},
create(context) {
return {
CallExpression(node) {
if (node.callee.type === 'Identifier' && node.callee.name === 'add') {
if (node.arguments.length !== 2) {
context.report({
node,
message: 'add 必须接收两个参数'
});
}
}
}
};
}
};


另外,检查下你的 ESLint 配置文件,确保规则已经正确加载和启用。比如:

module.exports = {
parserOptions: {
ecmaVersion: 2020
},
rules: {
'your-rule-name': 'error' // 替换为你的规则名
}
};


最后提醒一下,调试的时候不要只靠 console.log,可以在 create 方法里加个断点,确保规则注册进去了。我之前也踩过类似的坑,折腾半天发现是规则没启用来着。
点赞
2026-02-19 19:01