TypeScript泛型类触发ESLint no-unused-vars错误问题排查
解决TypeScript泛型类索引签名引发的ESLint未使用变量报错
我写了一个用来约束值类型的简单泛型类:
export class Dictionary<T> { [key: string]: T }
但ESLint却报了错:
1:25 error 'T' is defined but never used @typescript-eslint/no-unused-vars
明明下一行就用到了T,这是检查器的bug还是我操作有误?我知道可以加注释忽略该行,但更希望用“正确”的方式修复问题。
我的ESLint规则配置如下:
"rules": { "@typescript-eslint/no-unused-vars": [ "error", { "ignoreRestSiblings": true } ], "no-unused-vars": "off" }
相关依赖包版本:
"@angular-eslint/builder": "17.3.0", "@angular-eslint/eslint-plugin": "17.3.0", "@angular-eslint/eslint-plugin-template": "17.3.0", "@angular-eslint/schematics": "17.3.0", "@angular-eslint/template-parser": "17.3.0", "@typescript-eslint/eslint-plugin": "7.2.0", "@typescript-eslint/eslint-plugin-tslint": "7.0.2", "@typescript-eslint/parser": "7.2.0", "eslint": "8.57.0", "eslint-plugin-import": "2.29.1", "eslint-plugin-deprecation": "2.0.0", "typescript": "5.2.2"
原因分析
这不是你的操作问题,而是@typescript-eslint/no-unused-vars规则在7.2.0版本中的误报——它没能正确识别索引签名里对泛型参数T的引用。
修复方案
推荐三种修复方式,按需选择:
1. 升级依赖版本
这个误报在@typescript-eslint的后续7.x版本中已经被修复。你可以把@typescript-eslint/eslint-plugin和@typescript-eslint/parser升级到7.8.0及以上的版本,升级后规则就能正确识别索引签名中的泛型使用了。
2. 调整ESLint规则配置
如果暂时不想升级依赖,可以修改规则配置,让它忽略常规的泛型参数命名(一般是单个大写字母):
"rules": { "@typescript-eslint/no-unused-vars": [ "error", { "ignoreRestSiblings": true, "varsIgnorePattern": "^[A-Z]$" } ], "no-unused-vars": "off" }
这个配置会忽略所有单个大写字母命名的泛型参数,既能解决当前问题,也不会影响其他正常的未使用变量检测。
3. 微调代码结构
如果你愿意修改代码,可以添加一个简单的方法来显式使用泛型参数,让ESLint识别到T的用途:
export class Dictionary<T> { [key: string]: T; get(key: string): T | undefined { return this[key]; } }
这样既符合字典类型的需求,也能让ESLint停止报错。
内容的提问来源于stack exchange,提问作者John Montgomery
相关产品推荐
相关产品推荐

