#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, поэтому включите его как ошибку или предупреждение.