@typescript-eslint/parser 版本 8 对枚举中的索引签名抛出错误

问题描述 投票:0回答:1

将 @typescript-eslint/parser 从 7 升级到版本 8.5 会导致错误

error  'scope' is defined but never used  @typescript-eslint/no-unused-vars

对于像这样的代码

export type AuthorizationPayload = {
  [scope in Scope]?: Permission[]
}

export enum Scope {
  Serlo = 'serlo.org',
...
}

这是我们 CI 中的错误

这里是 eslint 文件

{
  "env": {
    "browser": true,
    "es6": true,
    "jest": true,
    "node": true
  },
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:@typescript-eslint/recommended-requiring-type-checking",
    "plugin:react/recommended",
    "prettier"
  ],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "project": ["tsconfig.json"]
  },
  "plugins": ["@typescript-eslint", "import", "react"],
  "rules": {
    // eslint
    "no-duplicate-imports": "error",
    "no-unused-vars": "off",
    "no-console": "error",

    // @typescript-eslint/eslint-plugin
    "@typescript-eslint/ban-ts-comment": "warn",
    "@typescript-eslint/ban-types": [
      "error",
      {
        "types": {
          "String": {
            "message": "Use string instead",
            "fixWith": "string"
          },
          "Boolean": {
            "message": "Use boolean instead",
            "fixWith": "boolean"
          },
          "Number": {
            "message": "Use number instead",
            "fixWith": "number"
          },
          "Symbol": {
            "message": "Use symbol instead",
            "fixWith": "symbol"
          },
          "Object": {
            "message": "Use object instead",
            "fixWith": "object"
          },
          "Function": {
            "message": "The `Function` type accepts any function-like value.\nIt provides no type safety when calling the function, which can be a common source of bugs.\nIt also accepts things like class declarations, which will throw at runtime as they will not be called with `new`.\nIf you are expecting the function to accept certain arguments, you should explicitly define the function shape."
          },
          "{}": {
            "message": "`{}` actually means \"any non-nullish value\".\n- If you want a type meaning \"any object\", you probably want `object` instead.\n- If you want a type meaning \"any value\", you probably want `unknown` instead.\n- If you want a type meaning \"empty object\", you probably want `Record<string, never>` instead."
          }
        },
        "extendDefaults": false
      }
    ],
    "@typescript-eslint/consistent-type-definitions": ["error", "interface"],
    "@typescript-eslint/explicit-module-boundary-types": "off",
    "@typescript-eslint/no-empty-function": "off",
    "@typescript-eslint/no-extraneous-class": "error",
    "@typescript-eslint/no-parameter-properties": "off",
    "@typescript-eslint/no-this-alias": "warn",
    "@typescript-eslint/no-unused-vars": [
      "error",
      { "argsIgnorePattern": "^_" }
    ],
    "@typescript-eslint/no-use-before-define": [
      "error",
      {
        "classes": false,
        "functions": false,
        "typedefs": false
      }
    ],
    "@typescript-eslint/no-useless-constructor": "error",
    "@typescript-eslint/prefer-ts-expect-error": "error",

    // eslint-plugin-import
    "import/export": "error",
    "import/extensions": ["error", "never", { "json": "always" }],
    "import/first": "error",
    "import/newline-after-import": "error",
    "import/no-absolute-path": "error",
    "import/no-commonjs": "error",
    "import/no-cycle": "error",
    "import/no-default-export": "error",
    "import/no-deprecated": "error",
    "import/no-internal-modules": [
      "error",
      {
        "allow": [
          "@pact-foundation/pact/src/dsl/matchers",
          "msw/node",
          "msw/lib/**",
          "mysql2/promise",
          "io-ts/lib/*",
          "io-ts-types/lib/*",
          "fp-ts/lib/*",
          "ts-jest/utils",
          "@apollo/server/plugin/disabled",
          "@apollo/server/express4"
        ]
      }
    ],
    "import/no-mutable-exports": "error",
    "import/no-self-import": "error",
    "import/no-unassigned-import": "error",
    "import/no-useless-path-segments": [
      "error",
      {
        "noUselessIndex": true
      }
    ],
    "import/order": [
      "error",
      {
        "alphabetize": {
          "order": "asc"
        },
        "groups": [
          ["builtin", "external", "internal"],
          ["parent", "sibling", "index", "unknown"]
        ],
        "newlines-between": "always"
      }
    ],

    // eslint-plugin-react
    "react/jsx-boolean-value": "error",
    "react/jsx-curly-brace-presence": "error",
    "react/prop-types": "off"
  },
  "settings": {
    "react": {
      "pragma": "h",
      "version": "16.8"
    }
  },
  "overrides": [
    {
      "files": [
        "__fixtures__/**/*",
        "__tests-pacts__/**/*",
        "__tests__/**/*",
        "jest.setup.ts",
        "jest.setup-pacts.ts"
      ],
      "rules": {
        "@typescript-eslint/no-non-null-assertion": "off",
        "import/no-extraneous-dependencies": "off"
      }
    }
  ]
}

当然,我可以在每个这样的情况之前放置一个“_${}”,但是代码中有很多这样的情况,我实际上认为 typescript-eslint 不应该在这里抛出错误(我的意思是这是一个回归在版本 8) 中。有优雅的解决方案吗?

我怎么能忽视这样的情况呢?

任何人都可以向我解释这种处理对象动态键(即枚举中的索引签名)的新方法背后的原因吗?

typescript eslint
1个回答
0
投票

我检查了你的 CI 构建。 更新

@typescript-eslint/parser
但不更新
@typescript-eslint/eslint-plugin
可能不是很有用。尤其是这个大版本跳跃。

所提供的代码本身可以在 ts-eslint playground 中运行。

© www.soinside.com 2019 - 2024. All rights reserved.