如何仅为特定类/继承类启用TypeScript ESLint naming-convention规则?
如何仅为特定代码段启用ESLint规则(默认全局禁用)
可以实现默认全局禁用@typescript-eslint/naming-convention规则,仅让其作用于继承AbstractWidget的类的属性。以下是几种实用方案:
方案一:通过ESLint的override配置匹配目标文件
如果所有继承AbstractWidget的类都集中在特定目录(比如src/widgets/),可以用全局禁用+局部覆盖的方式:
- 全局先把规则设为禁用
- 在
overrides里指定目标文件范围,重新启用规则并配置snake_case要求
配置示例(.eslintrc.json):
{ "rules": { "@typescript-eslint/naming-convention": "off" }, "overrides": [ { "files": ["src/widgets/**/*.ts"], "rules": { "@typescript-eslint/naming-convention": [ "error", { "format": ["snake_case"], "selector": "classProperty" } ] } } ] }
方案二:用ESLint注释块精准控制代码段
如果目标类分散在不同文件,可通过注释块在类的范围内启用规则,全局保持禁用:
示例代码:
// 全局规则默认禁用,仅当前类启用 /* eslint-enable @typescript-eslint/naming-convention */ export class HeaderWidget extends AbstractWidget implements HeaderWidget.State { public readonly widget_type: WidgetType = WidgetType.Header; public text!: string; public image_data!: string; public image_data_alt!: string; public hide_on_mobile!: boolean; // ... } /* eslint-disable @typescript-eslint/naming-convention */ // 其他类代码,规则保持禁用 export class OtherClass { public camelCaseProperty!: string; // 不会触发规则 }
也可以在文件开头先禁用规则,只给目标类开绿灯,避免重复写禁用注释。
方案三:自定义ESLint规则(精准匹配继承关系)
如果需要严格匹配所有继承AbstractWidget的类(不管文件位置),可以编写自定义规则:
步骤1:创建自定义规则文件
比如在项目根目录新建lib/rules/abstract-widget-snake-case.js,核心逻辑如下:
module.exports = { meta: { type: 'suggestion', docs: { description: 'Enforce snake_case for properties in classes extending AbstractWidget' }, schema: [] }, create(context) { return { ClassProperty(node) { // 找到当前属性所属的类节点 const classNode = node.parent.parent; // 检查类是否继承自AbstractWidget const extendsTarget = classNode.superClass?.name === 'AbstractWidget'; if (extendsTarget) { const propertyName = node.key.name; // 验证是否为snake_case const isValid = /^[a-z_]+$/.test(propertyName); if (!isValid) { context.report({ node, message: `Property '{{name}}' must use snake_case format`, data: { name: propertyName } }); } } } }; } };
步骤2:配置ESLint启用自定义规则
在.eslintrc.json中注册插件并启用规则:
{ "rules": { "@typescript-eslint/naming-convention": "off", "custom/abstract-widget-snake-case": "error" }, "plugins": [ "custom" ], "settings": { "import/resolver": { "node": { "paths": ["lib"] } } } }
注意:需要确保ESLint能找到自定义规则的路径,可根据项目结构调整paths配置。
内容的提问来源于stack exchange,提问作者JasonBodnar
相关产品推荐
相关产品推荐

