ESLint - 为 TypeScript 配置"no-unused-vars"



我在所有TypeScript项目中使用ESLint,设置如下:

"extends": ["airbnb", "prettier", 'plugin:vue/recommended'],
"plugins": ["prettier"],
"parserOptions": {
"parser": "@typescript-eslint/parser",
"ecmaVersion": 2018,
"sourceType": "module"
},
  • 一堆自定义规则。我还安装了以下TypeScript支持依赖项:

    "@typescript-eslint/eslint-plugin": "^1.7.0",
    "@typescript-eslint/parser": "^1.7.0",
    

然而,ESLint最有用的规则之一,https://eslint.org/docs/rules/no-unused-vars,对于TypeScript项目的配置似乎非常糟糕。例如,当我导出一个枚举时,规则会警告我该枚举在声明它的文件中没有使用:

export enum Foo {
Bar,
}

类似地,当我导入一个要用作类型的接口或类时,"没有未使用的vars"将在实际导入的行中再次抱怨:

在Foo.ts

export interface Foo {
bar: string;
}

在bar.ts

import { Foo } from './Foo'
const bar: Foo = { bar: 'Hello' };

有没有什么方法可以配置无未使用的vars规则来考虑这两种情况?我不喜欢禁用该规则,因为在这些情况之外,它是我整个规则集中最有用的规则之一。

我已经将规则降级为只给出警告而不是错误,但让我的所有文档都充满警告仍然有点违背了使用esLint的目的。

按照这里的建议,用//eslint禁用行填充我的所有文档似乎也是一个糟糕的解决方案。

我认为"plugin:@typescript-eslint/eslint-recommended"的使用引入了一堆不需要的规则。使用"@typescript-eslint/no-unused-vars"ESLint规则可能更好。

{
"parser": "@typescript-eslint/parser",
"plugins": [
"@typescript-eslint",
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
],
"rules": {
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": ["error"]
}
}

注意:请确保在进行上述更改后重新启动服务器

参考-https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-unused-vars.md

它在文档中有点隐藏,但如果您向"extends"属性添加一些内容,您可以使用ESLint推荐的两个规则,就像没有未使用的变量一样,并让它在Typescript中实际工作。像这样:

"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
],

@typescript eslint/recommended似乎是允许eslint:recommender有效处理typescript构造的东西。但不确定它会如何影响您的其他扩展。

我在最新的TypeScript/ES Lint版本中遇到了很多错误,我发现他们想出了一个实验规则来修复坏了的no-unused-vars,而使用实验规则@typescript-eslint/no-unused-vars-experimental,它最终如我所期望的那样工作。

在我这边进行更改之前,我在使用接口/类型时出现了多个错误,说这些变量是未使用的(当然,它们永远不会被使用,因为它们不是变量,而是接口/类型)。。。如果你对代码本身感到好奇,这里是PR添加的这个实验规则,这就是我如何找到这个规则的。

这是我更新的.eslintrc文件的子集

{
"parser": "@typescript-eslint/parser",
"extends": [
"plugin:@typescript-eslint/recommended"
],
"rules": {
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-unused-vars-experimental": "error",
"no-unused-vars": "off"
}
}

我现在终于恢复正常了:)

编辑(2021年1月)

正如Brad(项目的维护者)在下面的评论中所提到的,这是一个临时解决方案,现在已被弃用。根据他的评论(如下),我们现在可以直接将@typescript-eslint/no-unused-vars用于相同的预期行为。感谢Brad提供的信息。我还可以确认,切换回@typescript-eslint/no-unused-vars现在对我有效(我更新了代码,现在一切都很好)。

这不是一条路,你应该避免它。@typescript-eslint/no-unused-vars-experimental已被弃用,将在下一个主要版本中删除。更新到工具的最新版本,只需使用@typescript-eslint/no-unused-vars即可。来源:我是这个项目的维护者。

自2021年1月以来更新的答案因此,这是我的.eslintrc文件的最新更新,对我有效:)

{
"parser": "@typescript-eslint/parser",
"extends": [
"plugin:@typescript-eslint/recommended"
],
"rules": {
"@typescript-eslint/no-unused-vars": "error",
"no-unused-vars": "off"
}
}

我的问题是使用decorator,并希望有一个具有适当名称的变量以保持清晰,例如:

@OneToMany((type) => Employee)代替@OneToMany(() => Employee)

TypeScript的常见解决方案是在前缀前加下划线:

@OneToMany((_type) => Employee)

也有可能让ESLint接受同样的东西:

.eslintrc.js

module.exports = {
...
rules: {
'@typescript-eslint/no-unused-vars': ['warn', { 'argsIgnorePattern': '^_' }]
....
},
};

对于那些在使用YAML配置(例如.eslintrc.yaml)时希望在TypeScript中没有未使用的变量正常工作的人来说,它看起来是这样的:

rules:
"@typescript-eslint/no-unused-vars":
- warn
- argsIgnorePattern: "^_"                # <-- NOTE!
varsIgnorePattern: "^_"
caughtErrorsIgnorePattern: "^_"
no-unused-vars: # disabled but see typescript-eslint/no-unused-vars
- off
...

您在parserOptions中嵌套了parser。它应该是一个兄弟,像这样:

"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 2018,
"sourceType": "module"
},

至于no-unused-vars,恐怕这是@typescript-eslint的一个持续错误:https://github.com/typescript-eslint/typescript-eslint/issues/363

@typescript-eslint/eslint-plugin@typescript-eslint/parser从3.x升级到最新的4.x为我解决了这个问题。

对我来说,还有工作规则/eslint没有未使用的变量:[quot;error",{quot;varsIgnorePattern">

"rules": {
"no-unused-vars": [
"error",
{
"varsIgnorePattern": "^[A-Z]"
}
],
}

有关详细信息和属性,您可以查看此链接。

在我看来,对于同时使用typescript和javascript的项目来说,关闭规则有点危险。

解决方案是定义";覆盖";在.eslintrc.json文件的根级别上:

"overrides": [
{
"files": ["*.ts"],
"rules": {
"no-unused-vars": "off"
}
}
],

几年后仍然出现同样的错误。试图检查它为什么不起作用是令人沮丧的。在尝试了很多可能的配置之后,这里终于为我工作了。如果有人像我一样有困难的话!

eslintrc.js

module.exports = {
env: {
browser: true,
node: true,
},
parser: "@typescript-eslint/parser",
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"prettier",
"plugin:prettier/recommended",
"plugin:@typescript-eslint/recommended",
],
parserOptions: {
ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features
project: "tsconfig.eslint.json",
tsconfigRootDir: __dirname,
sourceType: "module", // Allows for the use of imports
},
plugins: ["@typescript-eslint", "@typescript-eslint/tslint", "import", "unused-imports"],
rules: {
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-unused-vars-experimental": "error",
"no-unused-vars": "off",
"import/order": "error",
"no-console": ["warn", { allow: ["warn", "error"] }],
eqeqeq: ["error", "always"],
"no-else-return": "error",
},
settings: {
"import/resolver": {
node: {
extensions: [".js", ".jsx", ".ts", ".tsx"],
moduleDirectory: ["node_modules", "src/"],
},
},
},
};

我使用这个配置,它能正常工作

{
"env": {
"browser": true,
"es2021": true,
"node": true,
"jest": true
},
"extends": ["airbnb-base", "prettier"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": ["@typescript-eslint", "jest"],
"rules": {
"import/extensions": "off",
"@typescript-eslint/no-unused-vars": ["error"]
},
"settings": {
"import/resolver": {
"node": {
"extensions": [".js", ".jsx", ".ts", ".tsx"]
}
}
}
}

最新更新