单例类静态属性类型声明触发ESLint no-use-before-define错误排查
问题根本原因
你遇到的是ESLint原生规则对TypeScript语法的适配问题:
- 你当前的ESLint配置仅替换了
no-unused-vars、no-shadow这两条规则的TS适配版本,没有禁用原生的no-use-before-define规则,也没有启用@typescript-eslint提供的对应适配规则 - 原生
no-use-before-define规则无法识别TypeScript类静态成员的声明逻辑,会把你在_instance类型标注中引用的UserService判定为「尚未完成定义的变量」,因此抛出误报 - 其他仓库没有报错的常见原因是对应仓库已经做了原生规则替换,或是ESLint、airbnb配置的版本存在差异,原生规则对类场景的判定逻辑不同
代码可以正常运行是因为TypeScript本身支持类内部引用自身作为类型,运行时类声明存在提升,你的写法本身完全符合TS和JS的语法规范,只是ESLint规则误判。
修复方案
在你的.eslintrc.json的rules字段中新增两条配置即可:
{ "rules": { // 新增以下两行 "no-use-before-define": "off", "@typescript-eslint/no-use-before-define": "error" } }
@typescript-eslint/no-use-before-define是专门适配TypeScript语法的规则,不会对类静态成员引用自身的场景做误判,同时可以保留原规则的校验能力,不需要全局禁用这条规则。
内容的提问来源于stack exchange,提问作者Bas
相关产品推荐
相关产品推荐

