@typescript-eslint/no-unused-vars 类型声明中的误报
Posted
技术标签:
【中文标题】@typescript-eslint/no-unused-vars 类型声明中的误报【英文标题】:@typescript-eslint/no-unused-vars false positive in type declarations 【发布时间】:2020-12-25 06:18:43 【问题描述】:@typescript-eslint/no-unused-vars 存在一个问题。 所以,我们有类型
type SomeType = (name: string) => void;
我们在带有类型声明的字符串中有 @typescript-eslint/no-unused-vars 错误,表示“名称”已定义但从未使用。。 p>
类型使用示例:
export const LogSomeInfo: SomeType = (name: string) =>
const a = name;
console.log(a);
;
或者:
interface CheckboxPropsType
value: string,
onClick(value: string): void
并且 eslint 在 onClick... 字符串处中断,表示该值已定义但从未使用过。 即使类型分配正确并且实际的 onClick 处理程序使用该值!
问题:这条规则有什么问题以及为什么它在这种情况下触发。为什么 eslint 将类型/接口中函数的类型声明识别为常规函数?是我的 eslint 配置有问题吗?
"eslint": "^7.7.0", "@typescript-eslint/eslint-plugin": "^3.6.1", "@typescript-eslint/parser": "^4.0.1", "eslint-config-airbnb-typescript": "^9.0.0",
"extends": [
"airbnb-typescript",
"airbnb/hooks",
"plugin:react/recommended",
"plugin:@typescript-eslint/recommended"
],
"parser": "@typescript-eslint/parser",
"parserOptions":
"ecmaFeatures":
"jsx": true
,
"ecmaVersion": 2018,
"sourceType": "module",
"project": "./tsconfig.json"
,
"settings":
"react":
"version": "detect"
,
"plugins": ["@typescript-eslint", "react-hooks", "react"],
"env":
"browser": true
,
"rules":
"object-curly-newline": 0,
"import/named": ["error"],
"indent": ["error", 4],
"react/jsx-indent": ["error", 4],
"comma-dangle": ["error", "never"],
"import/prefer-default-export": "off",
"react/jsx-fragments": "off",
"arrow-body-style": "off",
"object-curly-spacing": "off",
"@typescript-eslint/indent": ["error", 4, "SwitchCase": 1],
"@typescript-eslint/explicit-module-boundary-types": "off",
"no-undef": "error",
"react/jsx-indent-props": ["error", 4],
"max-len": ["error", "code": 120 ],
"react/prop-types": "off"
【问题讨论】:
为什么选择 eslint-plugin 3.6.1 和 parser 4.0.1?您是否尝试将两者更新到相同的版本(例如 4.0.1)? 遇到了具有相同症状的不同问题。我们使用no-unused-vars
而不是@typescript-eslint/no-unused-vars
。将 @typescript-eslint/eslint-plugin 和 @typescript-eslint/parser 升级到 4.9.0 并将以下内容添加到 .eslintrc 解决了这个问题:"no-unused-vars": 0, "@typescript-eslint/no-unused-vars": ["error", argsIgnorePattern: "^_" ]
【参考方案1】:
你应该更新你的 package.json 中的包:"@typescript-eslint/eslint-plugin": "^4.4.1"
并运行npm install
来安装它,之后如果仍然出现错误,请尝试将其添加到 eslintrc 文件或 eslint 配置中的规则:'no-unused-vars': 'off'
【讨论】:
【参考方案2】:之前问过的类似问题检查:Why ESLint throws 'no-unused-vars' for TypeScript interface?
在 tsconfig.json 中禁用 '@typescript-eslint/no-unused-vars': 0
规则并改为使用 "strict": true
、"noUnusedLocals": true
和 "noUnusedParameters": true
【讨论】:
是的。可能是正确的解决方案。您可以禁用此规则,并添加到 tsconfig --noUnusedLocals 和 --noUnusedParameters,或者您可以将 @typescript-eslint/no-unused-vars-experimental 添加到 eslintrc。两种方法都解决了问题no-unused-vars-experimental
是实验性的,此后已被弃用。它将在下一个专业中删除 - 不要使用它。如果您想使用 TS 内置的未使用检查或 eslint 规则,由您决定。 TS 检查会阻止你的构建,所以很多人不喜欢它们。请参阅下面的答案,了解如何修复您的 eslint 配置。
构建将如何被阻止?如果您遵守严格的规定
TypeScript 默认发出,只要文件在语法上有效。 --noEmitOnError
不是默认值。
当然这是默认设置 - 但我见过的大多数用户配置都专门重新配置为不发出错误,因此他们不会测试不正确的奇怪代码。这就是为什么这么多用户喜欢不使用 TS 选项 - 因为它阻碍了他们的发展。【参考方案3】:
来源:我是typescript-eslint
项目的维护者。
如果您将@typescript-eslint/parser
和@typescript-eslint/eslint-plugin
的版本更新到v4.1.0,您将能够使用使@typescript-eslint/no-unused-vars
在所有情况下都能正常工作的最新更改。
顺便说一句 - 使用 v3.x 的插件,但使用 v4.x 的解析器会使你进入一个非常奇怪的状态,具有未定义和不受支持的行为。
您应该确保始终使用相同版本的两个包,因为每个版本都是一起发布的。
【讨论】:
谢谢。我遇到了同样的问题,现在将这两个库从 4.0.1 升级到 4.4.1 后它可以工作了。 这是今天更好的解决方案。确认在 4.20.0 上工作 我使用的是4.22.1
版本,但仍然收到警告。是否需要任何其他配置来禁用 Types
或 Interfaces
中的函数参数的 linting?
我在版本 4.29.0
上都有,但我仍然面临这个问题。
@Garrett - 更新到最新版本。 4.6.1
大约 10 个月大以上是关于@typescript-eslint/no-unused-vars 类型声明中的误报的主要内容,如果未能解决你的问题,请参考以下文章