Search code examples
npmreact-scriptseslintrctypescript-eslint

@typescript-eslint/eslint-plugin installed but throw error in vs code lint task and ask for non existing @typescript-eslint package


create project with "react-scripts": "^4.0.3" boilerplate and in order to include eslintrc.js file in the react with typescript project,I have tried eslint --init and it creates a default eslintrc.js and below is the content.

having eslint v 7.32.0 in global

eslintrc.js

module.exports = {
  env: {
    browser: true,
    es2021: true,
  },
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:@typescript-eslint/recommended',
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaFeatures: {
      jsx: true,
    },
    ecmaVersion: 12,
    sourceType: 'module',
  },
  plugins: ['react', '@typescript-eslint'],
  rules: {},
};

but es lint task in vs code was throwing error

(node:37609) UnhandledPromiseRejectionWarning: TypeError: Failed to load plugin '@typescript-eslint' declared in '.eslintrc.js': Class extends value undefined is not a constructor or null

package.json

"devDependencies": {
    "@types/classnames": "^2.3.1",
    "@types/react-redux": "^7.1.19",
    "@types/react-router-dom": "^5.3.1",
    "@typescript-eslint/parser": "^4.33.0",
    "eslint": "^7.32.0",
    "eslint-plugin-import": "^2.25.2",
    "typescript": "^4.4.4"
  },
 "dependencies": {
    "@types/jest": "^26.0.15",
    "@types/node": "^12.0.0",
    "@types/react": "^17.0.0",
    "@types/react-dom": "^17.0.0",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-redux": "^7.2.5",
    "react-router-dom": "^5.3.0",
    "react-scripts": "^4.0.3",
    "redux": "^4.1.1",
}

now when I run below command to install the missing package

npm i --save-dev @typescript-eslint/eslint-plugin

it throws error in terminal

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: [email protected]
npm ERR! Found: @typescript-eslint/[email protected]
npm ERR! node_modules/@typescript-eslint/parser
npm ERR!   dev @typescript-eslint/parser@"^4.33.0" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer @typescript-eslint/parser@"^5.0.0" from @typescript-eslint/[email protected]
npm ERR! node_modules/@typescript-eslint/eslint-plugin
npm ERR!   dev @typescript-eslint/eslint-plugin@"*" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

npm ERR! A complete log of this run can be found in

So as per suggestion tried with option

npm i --save-dev @typescript-eslint/eslint-plugin --legacy-peer-deps

it was installed successfully but with higher version (5.x) than the @typescript-eslint/parser version and as per mentioned on the eslint-plugin documentation

It is important that you use the same version number for @typescript-eslint/parser and @typescript-eslint/eslint-plugin.

so re install package of similar version

> npm install --save-dev @typescript-eslint/[email protected]

but in vs code it still throw error of

UnhandledPromiseRejectionWarning: TypeError: Failed to load plugin '@typescript-eslint' declared in '.eslintrc.js': Class extends value undefined is not a constructor or null

so I have tried to install

npm install --save-dev @typescript-eslint

but it throw error

npm ERR! code EINVALIDTAGNAME
npm ERR! Invalid tag name "@typescript-eslint": Tags may not have any characters that encodeURIComponent encodes.

also tried by updating es lint latest version 8.0 but it creates another problem.

I know that this is because I am trying to install a package which does not exist but how to solve this? am I missing something here.

  • vscode - v 1.61.1
  • ubuntu - v 20.04

Solution

  • after checking at eslint plugin naming convention, found out that I have to install the missing @typescript-eslint as following syntax

    npm install --save-dev @typescript-eslint/eslint-plugin

    this solved the issue but new error coming that react version is not specified , so added that in "settings" key.

    eslintrc.js

    // eslint-disable-next-line no-undef
    module.exports = {
      env: {
        browser: true,
        es2021: true,
      },
      extends: [
        'eslint:recommended',
        'plugin:react/recommended',
        'plugin:@typescript-eslint/recommended',
      ],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaFeatures: {
          jsx: true,
        },
        ecmaVersion: 12,
        sourceType: 'module',
      },
      plugins: ['react', '@typescript-eslint'],
      rules: {
        '@typescript-eslint/no-explicit-any': 'off',
        'react/react-in-jsx-scope': 'off',
        '@typescript-eslint/explicit-module-boundary-types': 'off',
      },
      settings: {
        react: {
          version: 'latest',
        },
      },
    };
    

    package.json

    "devDependencies": {
        "@types/classnames": "^2.3.1",
        "@types/react-redux": "^7.1.19",
        "@types/react-router-dom": "^5.3.1",
        "@typescript-eslint/eslint-plugin": "^4.33.0",
        "@typescript-eslint/parser": "^4.33.0",
        "eslint": "^7.32.0",
        "eslint-plugin-import": "^2.25.2",
        "redux-devtools": "^3.7.0",
        "redux-devtools-extension": "^2.13.9",
        "typescript": "^4.4.4"
      }
    

    tsconnfig.json

    {
      "compilerOptions": {
        "target": "es5",
        "lib": ["dom", "dom.iterable", "esnext"],
        "allowJs": true,
        "skipLibCheck": true,
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "strict": true,
        "forceConsistentCasingInFileNames": true,
        "noFallthroughCasesInSwitch": true,
        "module": "esnext",
        "noImplicitAny": false,
        "moduleResolution": "node",
        "resolveJsonModule": true,
        "isolatedModules": true,
        "downlevelIteration": true,
        "noEmit": true,
        "jsx": "react-jsx"
      },
      "include": ["src"]
    }