Eslint不会使用Node.js 12确认私有字段声明

时间:2019-08-06 23:17:19

标签: node.js eslint private private-members

即使我使用的是NodeJS版本12(支持它们),Eslint也无法识别类声明中带有#标记的私有字段。

我正在运行NodeJS v12.7.0。我已经搜索了所有DuckDuckGo和Goole,但是在eslint中找不到插件或选项,该插件或选项会告诉它接受私有字段符号(#)。我已将emca设置为版本10

class MyClass {
   #foo = 'bar';
   #bar = 'foo';

   constructor(foo, bar) {
      this.#foo = foo;
      this.#bar = bar;
   }
   ...
};

当我在上面的代码上运行eslint时,我得到:

2:3 error Parsing error: Unexpected character '#'

我正在处理的项目未使用Babel,并且我不想为了使私有字段正常工作而将其包括在内。有什么想法可以使这项工作有效而不必求助于Babel吗?

(当然不反对Babel,只是我不想在这个特定项目上使用。)

4 个答案:

答案 0 :(得分:2)

我认为您可能不得不硬着头皮使用babel-eslinthttps://github.com/babel/babel-eslint,这需要您安装babel/core@>=7.2.0

尽管私有类字段包含在节点12中,但根据spec(截至2019年8月),它仍然是第3阶段的实验功能

npm install eslint babel-eslint --save-dev
# or
yarn add eslint babel-eslint -D

并添加

  "parser": "babel-eslint",

到您的.eslintrc.js文件

答案 1 :(得分:1)

推荐的答案有点过时了,babel-eslint软件包已更改,此外,您还需要确保也配置了Babel,就我而言,我在服务器上,所以不是。 / p>

我在这里写了有关解决方案的博客: https://dev.to/griffadev/setting-up-eslint-to-work-with-new-or-proposed-javascript-features-such-as-private-class-fields-5fm7

TL; DR:

npm i eslint @babel/core @babel/eslint-parser @babel/preset-env -D

示例.eslintrc

{
    "env": {
        "browser": true,
        "es2021": true,
        "node": true
    },
    "extends": "eslint:recommended",
    "parser": "@babel/eslint-parser",
    "parserOptions": {
        "ecmaVersion": 12,
        "sourceType": "module"
    },
    "rules": {
    }
}

配置.babelrc

{
    "presets": [
      ["@babel/preset-env",
      {
        "shippedProposals": true
      }]
    ]
}

如果您使用的是Jest,但尚未配置.babelrc,它将开始获取此新文件,这可能是一个问题。 您可以通过将.babelrc文件重命名为其他文件并更新eslint配置文件来解决此问题:

"babelOptions": {
    "configFile": "./.babel-eslintrc"
 }

答案 2 :(得分:0)

关于 Visual Studio 2019,我发现 @babel/eslint-parser 不适用,但较旧的 babel-eslint 可以。根据@George 的回答进行其他设置。

回答时的 Visual Studio 2019 版本:16.9.5

答案 3 :(得分:0)

除非你真的,真的想要那个特定的文件被删除,我会避免添加新的依赖项只是为了让测试通过。在这种情况下,我的建议是添加

ignorePatterns: ["path/to/file(s).js"],

在您的 .eslintrc.js 文件中。这将避免对特定文件进行 linting。如果您真的想要对它进行 lint,请将 # 替换为 __、lint,然后将其改回。我知道,这是一个 hack,但它不会引入任何类型的依赖,并且可以工作。