You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅为特定类/继承类启用TypeScript ESLint naming-convention规则?

如何仅为特定代码段启用ESLint规则(默认全局禁用)

可以实现默认全局禁用@typescript-eslint/naming-convention规则,仅让其作用于继承AbstractWidget的类的属性。以下是几种实用方案:

方案一:通过ESLint的override配置匹配目标文件

如果所有继承AbstractWidget的类都集中在特定目录(比如src/widgets/),可以用全局禁用+局部覆盖的方式:

  1. 全局先把规则设为禁用
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:45:34