埃斯林特说,所有的枚举在类型脚本应用程序是“已经声明在上面的范围”

启动一个新的应用程序时,我安装了 eslint 并使用以下配置对其进行了配置,但是每次我创建一个 enum时,它都说它已经被定义了。甚至是无意义的弦。其他变量类型(const、 var、 let)不存在这个问题。我可以禁用该规则,但我希望它适用于实际为真的情况。

    {
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"parserOptions": {
"project": ["./tsconfig.json"],
"ecmaFeatures": {
"ecmaVersion": 6,
"jsx": true
}
},
"overrides": [],
"extends": [
"airbnb-typescript",
"prettier",
"prettier/@typescript-eslint",
"plugin:@typescript-eslint/recommended-requiring-type-checking"
],
"rules": {
"spaced-comment": 0,
"import/prefer-default-export": 0,
"@typescript-eslint/no-use-before-define": 0,
"@typescript-eslint/restrict-template-expressions": [
1,
{ "allowBoolean": true }
],
"react/jsx-props-no-spreading": "off",
"react/state-in-constructor": 0,
"react/require-default-props": 0,
"react/destructuring-assignment": [
1,
"always",
{
"ignoreClassFields": true
}
]
}
}

enter image description here

69485 次浏览

如果您是 TSLint-to-ESLint 的用户,那么这是 一个已经被修复的错误,因此使用更新的版本重新运行脚本也可以解决这个问题,或者只需禁用 no-shadow并启用 @typescript-eslint/no-shadow

如果您正在使用一些滥用规则的公共配置,那么一定要让他们知道,仍然遇到这种情况的人数多少有些惊人。


参见 href = “ https://github.com/typeescript-eslint/blob/master/package/eslint-plugin/docs/rules/no-shadow. md # how-to-use”rel = “ norefrer”>@typeescript-eslint/no-shadow 如何使用 同样 < a href = “ https://github.com/typeescript-eslint/typeescript-eslint/blob/master/docs/getting-start/linting/FAQ.md # i-am-using-a-rule-from-eslint-core-and-it-does-work-right-with-typeescript-code”rel = “ noReferrer”> 本节 FAQ

怎么用

{
// note you must disable the base rule as it can report incorrect errors
"no-shadow": "off",
"@typescript-eslint/no-shadow": ["error"]
}

搜索 Typescript-eslint GitHub 问题可以看到很多人都在问同样的问题。

当我用对象的某个名称声明一个变量时,就会发生这个错误。我忘了把变量名放在小写字母而不是大写字母的对象的名称。像 TypeFile: TypeFile

解决方案: 要修复它,只需将变量名放在小写字母中。

生成此 Eslint 错误的代码示例:

这是我的 Enum: type-file-model. ts

public enum TypeFichier {
XML, PDF, IMAGE, ZIP
}

这是我的对象模型 app-file-model. ts

import {TypeFile} from 'app/shared/model/enum/type-file.model';


export interface IAppFile {
...
TypeFile?: TypeFile;
}


export class AppFile implements IAppFile{
constructor(
...
public TypeFile?: TypeFile
) {}
}

Tadhg McDonald-Jensen 的回答是有用的,但有一件事需要说明。将下列配置项直接写入 .eslintrc将报告一个错误:

{
// note you must disable the base rule as it can report incorrect errors
"no-shadow": "off",
"@typescript-eslint/no-shadow": ["error"]
}

这里有一个关于无阴影规则的正确例子:

{
"rules": {
"no-shadow": "off",
"@typescript-eslint/no-shadow": ["error"]
},
}

似乎把它添加到基本“规则”是不够的,我必须在重写下面再次添加它

# eslintrc.js
{
"rules": { // Did not work here as intended
"@typescript-eslint/dot-notation": "error",
"no-shadow": "off",
},
"overrides": [
{
"files": [
"*.ts"
],
...
"rules": { // Here it worked
"@typescript-eslint/dot-notation": "error",
"no-shadow": "off",
}
]
}

我对 TypeScript 中的以下代码也有类似的问题:

export enum MyEnum {
myValueOne = 'myValue',
myValueTwo = 'myValueTwo', // <-- got "already declared in the upper scope” error
}


export class myValueTwo {
constructor(){}
}

不幸的是,rulesoverrides都没有解决问题

 {
"rules": {
"no-shadow": "off",
"@typescript-eslint/no-shadow": ["error"]
},
"overrides": {
"no-shadow": "off",
"@typescript-eslint/no-shadow": ["error"]
},
}

在花了几个小时检查不同的问题,问题和有关问题的文档之后,我偶然发现了 @typescript-eslint/no-shadow的官方文档。这是链接

我必须做的是在 eslint 中为 @typescript-eslint/no-shadow添加额外的 ignoreTypeValueShadow选项。

我的最后一个无影设置是这样的:

{
"overrides": {
"no-shadow": "off",
"@typescript-eslint/no-shadow": ["error", , { "ignoreTypeValueShadow": true }]
},
}

我使用以下配置成功地阻止了错误的出现:

{
"rules": {
"no-shadow": "off",
"@typescript-eslint/no-shadow": ["off"]
}
}

对于这两种情况都使用“ off”,因为我注意到在我读到的所有示例中都有一个重复出现的模式,在第一个示例中使用“ off”,在第二个示例中使用“ error”。这使我怀疑它是否是正确的方法,但是我没有能够以另一种方式避免这些错误,甚至没有使用覆盖。