【问题标题】:Why ESLint throws 'no-unused-vars' for TypeScript interface?为什么 ESLint 会为 TypeScript 接口抛出“no-unused-vars”?
【发布时间】:2019-09-12 09:49:46
【问题描述】:

所以,我在 .ts 文件中有这段代码:

import {MicroEventInterface} from '../Interfaces';

export default class MicroEvent implements MicroEventInterface {

// code

而 ESLint 会抛出这个错误:

我在 ESLint 中有这个 TypeScript 配置:

typescript: {
    extends: [
        'plugin:@private/private/react' // private rep with React config
    ],
    parser: '@typescript-eslint/parser',
    plugins: [
        '@typescript-eslint',
        'import'
    ],
    settings: {
        'import/resolver': {
            'node': {
                'extensions': [
                    '.js',
                    '.jsx',
                    '.ts',
                    '.tsx'
                ],
                'moduleDirectory': [
                    'node_modules/',
                    'src/'
                ]
            }
        },
        react: {
            createClass: 'createClass',
            pragma: 'React',
            version: '0.14.9'
        }
    }
}

所以,一切似乎都很好,但我无法克服这个错误。

有什么建议吗?

谢谢!

UPD:

看起来如果我 console.log( --- , MicroEventInterface); 错误消失了。我认为,ESLint 并没有将implements 视为实际使用。

【问题讨论】:

  • ESLint 通常会在导入的模块未在定义范围内使用时抛出此类错误。基本上,它想说的是,“为什么你在不需要的时候还要导入一些东西”。
  • @VikasMishra 是的,我明白这一点。但我实际上将它与“实现”命令一起使用。
  • 实现某些东西并不意味着您正在使用它。实施只是规定它符合(可能使用)特定模块(如果需要)。
  • @VikasMishra 那么,我该如何解决这个问题呢?我应该将我的接口与组件放在同一个文件中吗?这是BP吗?
  • @Paleo 在 2019 年使用 TSLint 而不是 ESLint 的有效选项,因为 TSLint 项目已被弃用,有利于将 ESLint 与 TypeScript 一起使用:github.com/palantir/tslint/issues/4534

标签: typescript eslint


【解决方案1】:

将以下规则添加到您的 .eslintrc.json 文件中

{
  rules: {
    "@typescript-eslint/no-unused-vars": "warn",
  }
}

【讨论】:

    【解决方案2】:

    来源:我是typescript-eslint 项目的维护者。

    @typescript-eslint 工具的最新版本现在完全支持范围分析。

    所以现在解决这个问题的步骤是:

    • 将您的版本至少更新到@typescript-eslint/parser@typescript-eslint/eslint-plugin 的v4.9.1
    • 将您的 ESLint 版本更新到至少 v6.0.0
    • 更新您的配置以使用@typescript-eslint/no-unused-vars

    重新启动 IDE,您现在应该会看到正确的 lint 错误。

    【讨论】:

    • @BradZacher - 你能详细说明update your config to use @typescript-eslint/no-unused-vars 位吗?它应该看起来像这样吗? "rules": { "import/first": "off", "no-unused-vars": "off", "@typescript-eslint/no-unused-vars": ["error"] }
    • @typescript-eslint/parser+plugin v4.14 和 eslint v7.18 上,实现的接口仍然会出现这种情况。
    • @JoepBeusenberg 是的,这里也一样。您找到解决问题的方法了吗?
    • @JayCodist - 这是第一个具有此功能的版本。但它现在已经 12 个月大了。考虑使用发布到 NPM 的最新版本。
    【解决方案3】:

    将此添加到 Eslint 规则中

    "rules": { "@typescript-eslint/no-unused-vars": [ 2, { "args": "none" } ] }

    【讨论】:

    【解决方案4】:

    使用@typescript-eslint/no-unused-vars-experimental并关闭@typescript-eslint/no-unused-vars

    该问题在后一个版本(实验性)中得到解决。

    示例配置:

    // .eslintrc
    {
      ...
      "rules": {
        "@typescript-eslint/no-unused-vars": "off",
        "@typescript-eslint/no-unused-vars-experimental": "error"
      }
      ...
    }
    
    

    【讨论】:

    • @typescript-eslint/no-unused-vars-experimental 现已弃用
    • 接受的答案对我不起作用,但顺便说一句
    【解决方案5】:

    为了在纯 TypeScript 项目中解决这个问题,我在我的 eslint 配置文件 (.eslintrc.json) 中添加了以下规则。要使这个特定的解决方案起作用,您必须遵循接口名称以大写“I”开头的约定。

    顺便提一下,在考虑是否在文件/模块中使用其他工件(即类)时,它们的第一个字母是大写“I”将被忽略。

    埃斯林特

    ...
        "rules": {
            ... other rules omitted ...,
            "no-unused-vars": [
                "warn",
                { 
                    "vars": "all",
                    "varsIgnorePattern": "[I]\\w+"
                }
            ]
        }
    ...
    

    有关此规则的更多信息,请参阅documentation

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 2020-01-25
      • 2018-11-22
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      相关资源
      最近更新 更多