40
votes

"parserOptions.project" a été défini pour @ typescript-eslint / parser

J'ai créé un nouveau projet React Native avec --template typescript

J'ai supprimé le répertoire de template qui faisait partie du passe-partout.

J'ai ensuite procédé à l'ajout d'ESLint:

module.exports = {
  parser: "@typescript-eslint/parser",
  plugins: ["@typescript-eslint"],
  extends: ["airbnb-typescript-prettier"]
};

Cependant, lorsque j'ouvre babel.config.js , j'obtiens cette erreur

Erreur d'analyse: "parserOptions.project" a été défini pour @ typescript-eslint / parser. Le fichier ne correspond pas à la configuration de votre projet: /Users/Dan/site/babel.config.js . Le fichier doit être inclus dans au moins un des projets fournis.


2 commentaires

Ajoutez babel.config.js dans le fichier tsconfig.js : "include": ["next-env.d.ts", " * / .ts", " * / .tsx", "postcss.config.js", ".eslintrc.js"]


@HimanshuTanwar pas besoin d'inclure babel.config.js , ne l' babel.config.js pas avec l'analyseur ESLint TypeScript. Jetez un œil à ma réponse pour une autre approche, en analysant uniquement les fichiers TS.


9 Réponses :


11
votes

Vous devez ajouter ce fichier à votre tableau d' include tsconfig. Voir typescript-eslint / typescript-eslint # 967 pour plus de détails.


4 commentaires

mais que faire si je veux qu'il soit ignoré? Il montre toujours si je l'ajoute dans le tableau d'exclusion.


Je crois que le fait est que typescript + eslint s'appuie sur l'analyseur @ typescript-eslint, de sorte que les fichiers lintés soient catégoriquement visibles par ts. Je ne suis honnêtement pas sûr de ce cas d'utilisation. Pourquoi en avez-vous besoin pour être exclu? Je crois que la philosophie de typescript-eslint est basée sur l'hypothèse que tous les fichiers linted devraient faire partie du projet, et tous les fichiers qui font partie du projet devraient être linted (même s'ils ne sont pas un point d'entrée critique pour le code de production) - Il serait judicieux par exemple de vouloir des erreurs de type si dans ce cas vous spécifiiez une mauvaise configuration babel.


Il peut y avoir un contexte plus utile que je devrais vérifier aussi ici


Vous n'avez pas besoin d'inclure ce fichier, ne l'analysez pas. Jetez un œil à ma réponse , je l'ai expliqué et partagé un code pour résoudre ce problème :)



13
votes

Comme suggéré dans ce numéro , vous pouvez ajouter createDefaultProgram: true à vos options d'analyseur en tant que solution temporaire, mais au détriment de potentiellement rendre votre IDE plus lent.

{
  ...
  parserOptions: {
    project: './tsconfig.json',
    createDefaultProgram: true,
  },
}


1 commentaires

N'utilisez pas createDefaultProgram . Il a été introduit comme un palliatif et sera supprimé dans une version future, comme expliqué dans ce numéro . Jetez un œil à ma réponse , j'ai expliqué pourquoi l'ajout de createdDefaultProgram résout l'erreur et comment résoudre sans ajouter cette option :)



31
votes

Vous pouvez créer un fichier de configuration TypeScript distinct ( tsconfig.eslint.json ) destiné à la configuration eslint . Ce fichier étend la configuration de tsconfig et les programmes d'installation include clé pour les fichiers qui doivent être lintés.

.eslint.js :

// ...
babel.config.js

tsconfig.eslint.json :

{
  "extends": "./tsconfig.json",
  "include": [
    // ...
    "babel.config.js"
  ]
}

Ou si vous voulez l'ignorer, vous pouvez le mettre dans .eslintignore .

.eslintignore :

// ...
parserOptions: {
  // ...
  project: "./tsconfig.eslint.json",
  // ...
},
// ...


1 commentaires

Vous n'avez pas besoin d'inclure ce fichier, ne l'analysez pas. Jetez un œil à ma réponse , je l'ai expliqué et partagé un code pour résoudre ce problème :)



1
votes

J'utilise un lien symbolique de mon dossier de projet pointer vers mon dossier de départ:

/opt/project/workspace => ~/worspace

En ouvrant le VSCode à l'aide du chemin du lien symbolique ~/workspace l'erreur persiste toujours.

L'ouverture de VSCode en utilisant le chemin d'origine: /opt/project/workspace résout le problème.

Cela ne devrait pas être un problème, mais pour l'instant c'est le cas.


0 commentaires

6
votes

Dans mes projets, une configuration appropriée que j'utilise est la suivante:

tsconfig.json

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",
  ],
}

tsconfig.eslint.json

{
  "extends": "./tsconfig.json",
  "include": [
    "src/**/*.ts",
    ".eslintrc.js",
    "tests/**/*.ts",
    "jest.config.js",
    "examples/**/*.ts"
  ],
  "exclude": ["node_modules"]
}

.eslintrc.js

{
  "compilerOptions": {
    /* Basic Options */
    "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
    "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
    "resolveJsonModule": true,
    "lib": [
      "es2017",
      "es7",
      "es6",
      "dom"
    ] /* Specify library files to be included in the compilation. */,
    "declaration": true /* Generates corresponding '.d.ts' file. */,
    "outDir": "lib" /* Redirect output structure to the directory. */,

    /* Strict Type-Checking Options */
    "strict": true /* Enable all strict type-checking options. */,
    "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,

    /* Advanced Options */
    "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*.ts"]
}


1 commentaires

Vous n'avez pas besoin d'inclure ces fichiers, il vous suffit de spécifier l'analyseur ESLint TypeScript pour analyser uniquement les fichiers corrects. Jetez un œil à ma réponse , je l'ai expliqué et partagé une configuration pour résoudre ce problème :)



0
votes

Dans notre cas, nous avons plusieurs .eslintrc et plusieurs tsconfig.json dans notre arborescence de répertoires. (Un pour le serveur à . , Et un pour le client React à ./client .)

Cela fonctionnait bien avec la CLI mais pas avec le plug-in de VS Code.

Le correctif consistait à définir la valeur du project ./client/.eslintrc pour qu'elle soit relative à la racine et non au fichier .eslintrc. Après l'avoir changé de "./tsconfig.json" en "./client/tsconfig.json", le lintage IDE fonctionne comme prévu.


0 commentaires

-1
votes

Vous devez inclure la prise en charge de typescript pour les fichiers *.config.js :

tsconfig.json :

{
  "include": [
    "**/*.config.js" // for *.config.js files
  ]
}

Et puis rechargez votre IDE!


0 commentaires

2
votes

Le problème survient pour l'une des raisons ci-dessous:

  1. Vous utilisez une règle qui nécessite des informations de type et n'a pas spécifié de parserOptions.project ;
  2. Vous avez spécifié parserOptions.project , n'avez pas spécifié createDefaultProgram ( il sera supprimé dans une version future ), et vous lintrez des fichiers non inclus dans le projet (par exemple babel.config.js , metro.config.js )

À partir de la documentation de TypeScript ESLint Parser :

parserOptions.project

Cette option vous permet de fournir un chemin vers le tsconfig.json votre projet. Ce paramètre est obligatoire si vous souhaitez utiliser des règles nécessitant des informations de type.

(...)

Notez que si ce paramètre est spécifié et que createDefaultProgram ne l'est pas, vous ne devez lint que les fichiers inclus dans les projets tels que définis par les fichiers tsconfig.json fournis. Si votre configuration existante n'inclut pas tous les fichiers que vous souhaitez lint, vous pouvez créer un tsconfig.eslint.json distinct.

Pour le résoudre, mettez à jour votre configuration ESLint comme suit:

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


0 commentaires

0
votes

J'ai eu ce problème dans VsCode lorsque j'ouvrais mon projet trop haut dans la structure des dossiers. Une solution étrange mais cela a fonctionné.

Dans mon exemple, le projet de fonctions Firestore pour express en .ts, j'ai dû l'ouvrir à partir du dossier de fonctions qu'il avait créé.

J'aurais dû remarquer que c'était ce genre de problème puisque 'npm run-script lint' n'a jamais renvoyé d'erreur lui-même.


0 commentaires