如何配置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
相关产品推荐
相关产品推荐

