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

如何配置typescript-eslint/utils编写的TS自定义ESLint规则

方案1:无需转译,直接加载TS编写的规则

核心逻辑是在ESLint加载插件前,通过ts-node注册TS文件的加载钩子,让Node可以直接识别.ts后缀的规则文件,不需要提前编译。

  • 前置依赖:确保项目已安装ts-node,和你编写规则用到的@typescript-eslint相关工具包(跑单元测试时已安装的依赖即可复用)。
  • 第一步:在项目根目录创建本地规则文件夹,例如命名为eslint-local-rules,把你写的TS规则统一放到eslint-local-rules/rules目录下。
  • 第二步:在eslint-local-rules下创建JS格式的插件入口文件index.js,内容如下:
require('ts-node').register({
  transpileOnly: true,
  compilerOptions: {
    module: 'CommonJS'
  }
});

module.exports = {
  rules: {
    // key为你自定义的规则名,value为对应TS规则的导出
    'my-custom-rule': require('./rules/my-custom-rule.ts').default
    // 多个规则按相同格式追加即可
  }
};
  • 第三步:在项目的ESLint配置文件中直接引用本地插件,不需要额外安装第三方本地规则插件:
{
  "plugins": ["./eslint-local-rules"],
  "rules": {
    "my-custom-rule": "error"
  }
}

如果你使用ESLint 8+的扁平配置格式(eslint.config.js),逻辑完全一致:只需要在配置文件最顶部先注册ts-node的加载钩子,再导入对应TS规则即可。

方案2:预转译为JS后加载

适合规则数量多、对Lint速度要求高,不想在ESLint运行时额外加载ts-node的场景。你之前尝试的各类本地规则插件默认不支持TS规则,核心原因就是Node本身默认不识别.ts后缀,提前转译后所有插件都可以正常加载。

  • 第一步:在本地规则目录下新增极简TS编译配置tsconfig.json:
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "CommonJS",
    "outDir": "./dist",
    "esModuleInterop": true,
    "skipLibCheck": true
  },
  "include": ["./rules/**/*.ts"]
}
  • 第二步:在package.json中新增规则构建脚本:
{
  "scripts": {
    "build:lint-rules": "tsc -p eslint-local-rules/tsconfig.json"
  }
}

每次修改规则后执行一次npm run build:lint-rules,就会把TS规则转译为CommonJS格式的JS文件输出到dist目录。

  • 第三步:插件入口直接引用编译后的JS文件即可,此时你的本地规则和普通JS编写的规则没有任何区别,各类本地规则导入插件都可以正常识别加载。
注意事项
  • 选择无转译方案时,如果使用IDE的ESLint插件做实时校验,要确保IDE加载的是项目本地安装的ESLint和ts-node,不要使用全局安装的版本,避免出现钩子加载失败的问题。
  • 无转译方案在规则数量较少时性能差异可以忽略,规则数量超过10个的话,预转译方案的启动速度会明显更快。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:51:25