Búsqueda de sitios web

node.js - Eslint dice que todos los enums en la aplicación de Typescript están «ya declarados en el ámbito superior»


Al empezar una nueva aplicación, instalé eslint y lo configuré con las siguientes configuraciones, pero cada vez que creo un enum dice que ya ha sido definido. Incluso cadenas sin sentido. Otros tipos de variables (const, var, let) no tienen este problema. Podría desactivar la regla, pero me gustaría que se aplicara en situaciones donde realmente sea cierto.

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

Respuesta #1

Si eres usuario de TSLint-to-ESLint, este era un error que desde entonces ha sido solucionado, por lo que volver a ejecutar el script con una versión más reciente también solucionaría el problema, o simplemente desactiva no-shadow y habilita @typescript-eslint/no-shadow

Si estás utilizando alguna configuración pública que esté haciendo un uso indebido de la regla, asegúrate de hacérselo saber; la cantidad de personas que todavía se encuentran con esto es algo asombrosa.


ver @typescript-eslint/no-shadow cómo usar también esta sección de FAQ

Cómo usar

module.exports = {
  "rules": {
    // Note: you must disable the base rule as it can report incorrect errors
    "no-shadow": "off",
    "@typescript-eslint/no-shadow": "warn"
  }
};

Buscar en los issues de typescript-eslint en GitHub muestra a varias personas preguntando lo mismo.

Respuesta #2

La respuesta de Tadhg McDonald-Jensen es útil, pero hay una cosa que necesita ser dicho. Escribir los siguientes elementos de configuración directamente en .eslintrc generará un error:

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

Aquí hay un ejemplo correcto con la regla de no sombreado:

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

Respuesta #3

Tuve un problema similar con el siguiente código en TypeScript:

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

export class myValueTwo {
   constructor(){}
}

Desafortunadamente, ni rules ni overrides resolvieron el problema

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

Después de pasar unas pocas horas revisando diferentes problemas, preguntas y documentación sobre el problema, me encontré con la documentación oficial de @typescript-eslint/no-shadow. Aquí está el enlace

Lo que tuve que hacer es agregar opciones adicionales ignoreTypeValueShadow en eslint para @typescript-eslint/no-shadow.

Mi configuración final para no-shadow se ve así:

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

Artículos relacionados