我在所有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"]
}
}
}
}