Eslint говорит, что все перечисления в приложении Typescript «уже объявлены в верхней области»

#node.js #typescript #eslint

#node.js #typescript #eslint

Вопрос:

Запуская новое приложение, я установил eslint и настроил его с помощью следующих конфигураций, но каждый раз, когда я создаю enum , оно говорит, что оно уже определено. Даже бессмысленные строки. Другие типы переменных (const, var, let) не имеют этой проблемы. Я мог бы отключить правило, но я бы хотел, чтобы оно применялось в ситуациях, когда оно действительно верно.

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

введите описание изображения здесь

Комментарии:

1. это базовое правило, которое выдает ошибку, отключает no-shadow и включает @typescript-eslint/no-shadow . смотрите это и последующие ссылки.

2. если @typescript-eslint/no-shadow у вас также возникают проблемы, возможно, вы используете устаревшую версию, посмотрите это , если это появится.

Ответ №1:

Если вы являетесь пользователем TSLint-to-ESLint, это была ошибка, которая с тех пор была исправлена, поэтому повторный запуск скрипта с более новой версией также устранит проблему или просто отключит no-shadow и включит @typescript-eslint/no-shadow

Если вы используете какую-то общедоступную конфигурацию, которая неправильно использует правило, обязательно сообщите им, количество людей, которые все еще сталкиваются с этим, несколько ошеломляет.


см @typescript-eslint / no-shadow как использовать также этот раздел часто задаваемых вопросов

Как использовать

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

Поиск проблем с typescript-eslint GitHub показывает, что несколько человек задают один и тот же вопрос.

Комментарии:

1. Может ли кто-нибудь, кто сталкивается с этим, пожалуйста, скажите мне, какую конфигурацию вы используете? если существует широко используемая общедоступная конфигурация, которая неправильно использует это правило, я бы хотел сообщить им об этом.

2. я использую конфигурацию по умолчанию, когда я обновляю angular с tslint на eslint с помощью CLI

3. Подтверждая, что это работает с .eslintrc.json, автоматически генерируемым инструментом TSLint-to-ESLint в Angular 11. Вы должны добавить строки выше пропуска { и } в overrides.rules[0] (первый элемент в массиве). Я бы опубликовал здесь полную конфигурацию, но в комментарии она будет перепутана. Если это объяснение недостаточно ясно, я могу создать суть GitHub.

4. @TadhgMcDonald-Дженсен: это шаг, который создает проблемную конфигурацию, исправляемую с помощью строк, которые вы указали выше: github.com/angular-eslint /…

5. Могу подтвердить, angular-eslint, преобразование из tslint в eslint, содержит эту проблему.

Ответ №2:

Ответ Тадхга Макдональда-Дженсена полезен, но есть одна вещь, которую нужно сказать. Запись следующих элементов конфигурации непосредственно в .eslintrc будет сообщать об ошибке:

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

Вот правильный пример с правилом отсутствия тени:

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

Ответ №3:

У меня была аналогичная проблема со следующим кодом в TypeScript:

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

export class myValueTwo {
   constructor(){}
}
  

К сожалению, ни rules то, ни overrides другое не решило проблему

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

Потратив несколько часов на проверку различных проблем, вопросов и документации о проблеме, я наткнулся на официальные документы @typescript-eslint/no-shadow . Вот ссылка

Что мне нужно было сделать, так это добавить дополнительные ignoreTypeValueShadow параметры в eslint для @typescript-eslint/no-shadow .

Моя окончательная настройка для no-shadow выглядит так:

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

Ответ №4:

Эта ошибка возникает у меня, когда я объявляю переменную с некоторым именем объекта. Я забыл указать имя переменной в нижнем регистре, а не в верхнем регистре, которое является именем объекта. например, TypeFile: TypeFile

Решение: чтобы исправить это, просто введите имя переменной в нижнем регистре.

Пример кода, генерирующего эту ошибку Eslint:

Это мое перечисление: type-file-model.ts

 public enum TypeFichier {
XML, PDF, IMAGE, ZIP
}
  

Это моя объектная модель app-file-model.ts

 import {TypeFile} from 'app/shared/model/enum/type-file.model';

export interface IAppFile {
  ...
  TypeFile?: TypeFile;
}

export class AppFile implements IAppFile{
  constructor(
    ...
    public TypeFile?: TypeFile
  ) {}
}
  

Ответ №5:

Похоже, добавления этого в базовые «правила» было недостаточно, и мне пришлось добавить его снова в переопределениях

 # eslintrc.js
{
  "rules": { // Did not work here as intended
    "@typescript-eslint/dot-notation": "error",
    "no-shadow": "off",
  },
  "overrides": [
    {
      "files": [
          "*.ts"
      ],
      ...
      "rules": { // Here it worked
          "@typescript-eslint/dot-notation": "error",
          "no-shadow": "off",
      }
  ]
}
  

Ответ №6:

Мне удалось предотвратить появление ошибки, используя следующую конфигурацию:

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

Используйте «выкл» для обоих случаев, поскольку я замечаю повторяющуюся закономерность во всех примерах, которые я читал, которые используют «выкл» в первом и «ошибка» во втором. Это заставляет меня сомневаться, что это правильный способ сделать это, но я не смог избежать этих ошибок другим способом, даже не используя перезапись.

Комментарии:

1. Таким образом вы не избегаете ошибок , вы просто гарантируете, что eslint не сообщит вам о них. Это два разных правила, one ( no-shadow ) — это базовое правило js, которое не работает должным образом в файлах TypeScript — вот почему вы должны отключить его для файлов Typescript . Другой — из typescript-eslint плагина, и он правильно идентифицирует ошибку в файлах Typescript, поэтому включите его как ошибку или предупреждение.