node.js - Eslint, TypeScript uygulamasındaki tüm enumların "üst kapsamda zaten tanımlandığını" söylüyor


Yeni bir uygulama başlatırken, eslint kurdum ve aşağıdaki yapılandırmalarla yapılandırdım, ancak her enum oluşturduğumda, daha önce tanımlanmış olduğunu söylüyor. Saçma dizeler bile. Diğer değişken türlerinde (const, var, let) bu sorun yok. Kuralı devre dışı bırakabilirim ama gerçekten geçerli olduğu durumlarda uygulanmasını isterim.

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

Cevap #1

Eğer TSLint-to-ESLint kullanıcısıysanız bu, daha sonra düzeltmiş olduğumuz bir hataydı, bu nedenle betiği daha yeni bir sürümle yeniden çalıştırmak da sorunu çözecektir veya sadece no-shadow özelliğini devre dışı bırakıp @typescript-eslint/no-shadow özelliğini etkinleştirebilirsiniz

Eğer kuralı yanlış kullanan bazı genel yapılandırmaları kullanıyorsanız, mutlaka onları bilgilendirin, hâlâ bu sorunla karşılaşan kişi sayısı oldukça şaşırtıcı.


@typescript-eslint/no-shadow bölümü nasıl kullanılır, ayrıca bu SSS bölümüne bakın

Nasıl kullanılır

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 sorunlarında arama yapmak, aynı şeyi soran birçok insan olduğunu gösteriyor.

Cevap #2

Tadhg McDonald-Jensen'in cevabı faydalıdır, ancak söylenmesi gereken bir şey var. Aşağıdaki yapılandırma öğelerini doğrudan .eslintrc dosyasına yazmak bir hata raporlayacaktır:

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

İşte no-shadow kuralıyla doğru bir örnek:

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

Cevap #3

TypeScript'te aşağıdaki kodla benzer bir sorun yaşadım:

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

export class myValueTwo {
   constructor(){}
}

Ne yazık ki rules veya overrides sorunu çözmedi

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

Sorun hakkında farklı Konular, sorular ve belgeleri birkaç saat inceledikten sonra @typescript-eslint/no-shadow resmi belgeleri ile karşılaştım. İşte link

Yapmam gereken, @typescript-eslint/no-shadow için eslint'te ek ignoreTypeValueShadow seçeneklerini eklemekti.

Gölgesiz için son kurulumum şöyle görünüyor:

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

İlgili makaleler