“parserOptions.project”已为@typescript-eslint/parser 设置

Dan*_*Dan 109 typescript eslint typescript-eslint

我创建了一个新的 React Native 项目 --template typescript

我删除了template作为样板文件一部分的目录。

然后我继续添加 ESLint:

module.exports = {
  parser: "@typescript-eslint/parser",
  plugins: ["@typescript-eslint"],
  extends: ["airbnb-typescript-prettier"]
};
Run Code Online (Sandbox Code Playgroud)

但是,当我打开时babel.config.js,出现此错误

解析错误:已为@typescript-eslint/parser 设置了“parserOptions.project”。

该文件与您的项目配置不匹配:/Users/Dan/site/babel.config.js.

该文件必须至少包含在提供的项目之一中。eslint

Raf*_*res 71

出现此问题的原因之一如下:

  1. 您正在使用需要类型信息且未指定parserOptions.project;的规则。
  2. 您指定了parserOptions.project,未指定createDefaultProgram它将在未来版本中删除),并且您正在整理项目中未包含的文件(例如babel.config.jsmetro.config.js

来自TypeScript ESLint Parser 文档

parserOptions.project

此选项允许您提供项目的tsconfig.json. 如果要使用需要类型信息的规则,则需要此设置。

(……)

请注意,如果此设置已指定createDefaultProgram但未指定,则您只能按照提供的tsconfig.json文件定义包含在项目中的 lint文件。如果您现有的配置不包括您想要 lint 的所有文件,您可以创建一个单独的tsconfig.eslint.json.

要解决它,请将您的 ESLint 配置更新为以下内容:

{
  // ...
  overrides: [
    {
      files: ['*.ts', '*.tsx'], // Your TypeScript files extension
      parserOptions: {
        project: ['./tsconfig.json'], // Specify it only for TypeScript files
      },
    }
  ],
  parser: '@typescript-eslint/parser',
  // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 将此类文件放入“.eslintignore”不是最干净的解决方案吗?检查配置文件并没有真正带来好处。使用“overrides”来重写 ESLint 配置以仅选取所需的文件感觉很奇怪 - 它不是只是模拟“忽略”但更加复杂吗? (6认同)
  • 这在第二种情况下不起作用,因为它仍然尝试将需要类型信息的规则应用于“.js”文件,例如“babel.config.js”。还需要将需要类型的规则添加到此覆盖子句中。因此,例如: `{ files: ['*.ts'], extends: [ 'plugin:@typescript-eslint/recommended-requiring-type-checking', ], parserOptions: { project: ['./tsconfig.json '], }, }` (5认同)
  • @bluenote10我同时使用“overrides.rules”和“rules”,因为我需要以不同的方式检查不同的文件。例如,“rules”包含我想要应用于所有文件的规则(“.ts”和“.js”),而我有 2 个不同的“overrides”来应用 TypeScript 规则(“@typescript-eslint-” )和测试文件的一些特定规则(例如,在“导入/无无关依赖项”规则中允许 devDependencies)。我不想忽略文件,只是为了根据其需要有不同的规则。 (3认同)
  • 上帝保佑你,保佑生下你的子宫,因为这很有效,我想说这句话,谢谢你,谢谢你,我现在不会辞职去麦当劳工作。 (3认同)

Žel*_*vić 65

您可以创建一个单独的 TypeScript 配置文件 ( tsconfig.eslint.json) 用于eslint配置。该文件扩展了必须检查的文件的tsconfig配置和设置include密钥。

.eslint.js

// ...
parserOptions: {
  // ...
  project: "./tsconfig.eslint.json",
  // ...
},
// ...
Run Code Online (Sandbox Code Playgroud)

tsconfig.eslint.json

{
  "extends": "./tsconfig.json",
  "include": [
    // ...
    "babel.config.js"
  ]
}
Run Code Online (Sandbox Code Playgroud)

或者如果你想忽略它,你可以把它放入.eslintignore.

.eslintignore

// ...
babel.config.js
Run Code Online (Sandbox Code Playgroud)

  • 您不需要包含该文件,只是不解析它。看看[我的答案](/sf/answers/4514193211/),我解释了它并分享了解决该问题的代码:) (2认同)
  • 这*正是*我需要的。我不想将这些文件包含到某些现有配置中,因为它们在构建时被交换,并且只会无缘无故地增加最终包,但同时我不想在这些文件上删除 lint。要添加的一件事:如果您扩展的配置有一个排除数组,您可能需要将其覆盖为空数组或不同的数组。我花了一些时间才弄清楚为什么我的 `"include": ["**/*.ts"]` 不起作用。非常感谢 Zeljko 的分享 (2认同)

eri*_*ock 21

您需要将该文件添加到您的 tsconfiginclude数组中。有关更多详细信息,请参阅typescript-eslint/typescript-eslint#967

  • 但如果我希望它被忽略怎么办?如果我将其添加到排除数组中,它仍然显示。 (11认同)
  • 我认为重点是 typescript+eslint 依赖于 @typescript-eslint 解析器,因此明确要求 linted 文件对 ts 可见。老实说,我不确定这个用例。为什么需要将其排除?我相信 typescript-eslint 的理念基于这样的假设:所有 linted 文件都应该是项目的一部分,并且属于项目一部分的所有文件都应该进行 linted(即使它们不是生产代码的关键入口点) - 例如,如果在这种情况下您指定了错误的 babel 配置,那么想要类型错误是有意义的。 (2认同)
  • 您不需要包含该文件,只是不解析它。看看[我的答案](/sf/answers/4514193211/),我解释了它并分享了解决该问题的代码:) (2认同)

Joh*_*edy 18

在我的 ESLint 配置中,我有以下配置:

.eslintrc.js

module.exports = {
  root: true,
  env: {
    node: true,
  },
  globals: {
    Promise: "readonly"
  },
  parser: "@typescript-eslint/parser",
  parserOptions: {
    sourceType: "module",
    tsconfigRootDir: __dirname,
    project: ["./tsconfig.eslint.json"],
  },
  plugins: ["@typescript-eslint"],
  extends: [
    "eslint:recommended",
    "prettier/@typescript-eslint",
    "plugin:@typescript-eslint/recommended",
    "plugin:@typescript-eslint/recommended-requiring-type-checking",
  ],
}
Run Code Online (Sandbox Code Playgroud)

更新 修复的关键部分是这样的:

parser: "@typescript-eslint/parser"
Run Code Online (Sandbox Code Playgroud)

和这个:

parserOptions: {
    sourceType: "module",
    tsconfigRootDir: __dirname,
    project: ["./tsconfig.eslint.json"], // could be tsconfig.json too
}
Run Code Online (Sandbox Code Playgroud)

不要忘记将该文件或文件的目录包含在includetsconfig.json 数组中。

  • 如果您〜检查项目中未包含的文件(例如 babel.config.js、metro.config.js)_ 如果您收到类似“该文件必须包含在至少其中之一”的错误,则这将不起作用项目提供的.eslint`那么就是这种情况。 (2认同)

Seb*_*opp 15

只需将eslint选项添加ignorePatterns到您的.eslintrc.js

module.exports = {
  root: true,
  parser: '@typescript-eslint/parser',
  parserOptions: {
    project: './tsconfig.json',
  },
  ignorePatterns: ["babel.config.js"],
  ...
Run Code Online (Sandbox Code Playgroud)

由于检查项目配置文件没有太大价值,因此您可以安全地忽略它们。

另外,我不会将它们作为您的一部分tsconfig.json或创建一个特殊tsconfig.eslint.json文件,只是为了检查目的。


qin*_*127 13

在“.eslintignore”中添加一行:

.eslintrc.js

  • 看在上帝的份上。这种绝对混乱的插件、扩展、语言版本、编译器版本和东西已经让我发疯了。 (95认同)
  • @YTG 我会解释一下。如果你将“parserOptions.project”设置为“@typescript-eslint/parser”,那么我猜你的项目是用 Typescript 编写的,对吗?但当应用于常规 js 文件时,它现在可能会崩溃。`.eslintrc.js` 本身也是一个 js 文件。这意味着您的 eslint 配置无法正确应用于自身。 (3认同)
  • 您能解释一下您的答案吗? (2认同)

Jer*_*yal 12

  1. npm i -D @types/node

  2. 包括对*.config.js文件的打字稿支持:

tsconfig.json

{
  "include": [
    "**/*.config.js" // for *.config.js files
  ]
}
Run Code Online (Sandbox Code Playgroud)

然后重新加载您的 IDE!

  • 就我而言,添加“**/*.eslintrc.js”并重新启动 IDE 修复了该问题。谢谢。 (2认同)

adi*_*1ya 11

只需在 .eslintrc.js 文件中添加以下代码即可。

ignorePatterns: ['.eslintrc.js']
Run Code Online (Sandbox Code Playgroud)


Ali*_*i80 8

该错误意味着存在一个可以编译的文件,但不属于当前定义的项目结构。有几种解决方案:

如果您不关心文件是否已编译(即配置文件等)

  • 将文件名添加到.eslintignore

或者

  • 将文件或文件模式添加到.eslintrc.js文件
ignorePatterns: ["babel.config.js"]
// or 
ignorePatterns: ["**/*.config.js"]
Run Code Online (Sandbox Code Playgroud)

您想要编译该文件

将文件、文件夹或模式添加到tsconfig.json文件

include": [
    "src",
    "other_src",
]
Run Code Online (Sandbox Code Playgroud)

注意一些更改需要重启IDE才能生效


Wen*_* Du 6

'@typescript-eslint/prefer-nullish-coalescing': 'error'添加到时我遇到了同样的问题.eslintrc.cjs,以下设置对我有用:

// tsconfig.json
{
  // ...
  "include": ["**/*", "**/.*"],
  "exclude": ["node_modules", "dist"]
}
Run Code Online (Sandbox Code Playgroud)
// tsconfig.json
{
  // ...
  "include": ["**/*", "**/.*"],
  "exclude": ["node_modules", "dist"]
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,解决了我的问题:`您使用了一条需要生成 parserServices 的规则。因此,您必须为 @typescript-eslint/parser 的“parserOptions.project”属性提供一个值。 (4认同)