Typescript 对象解构被 ESLint no-unused-vars 规则捕获

Typescript object destructuring is caught by ESLint no-unused-vars rule

我在 Typescript 中有一个对象,我正在解构它以提取部分对象。但是,它没有通过我的 linter 检查:

async someFunction(username: string): Promise<UserDTO> {
    const userEntity = await getUserByUsernameAsync(username);

    if (userEntity ) {
        const { password, ...result } = userEntity ;
        return result;
    }

    return null;
}

如您所见,上面的代码抓取了一个对象并去掉了对象中我们不想 return 的一些部分,return 删除了对象的其余部分。

然而,linter 给出警告:

warning  'password' is assigned a value but never used      @typescript-eslint/no-unused-vars

对象解构正在将 passport 分配给一个值,将 result 分配给另一个对象值,而 passport 是未使用的值。我该如何解决这个问题才能通过 linter?

您可以在 eslintrc.js.

中添加 "@typescript-eslint/no-unused-vars": ["error", { "ignoreRestSiblings": true }] 到您的规则列表中,为其他兄弟姐妹禁用此验证

示例:

module.exports = {
  root: true,
  parser: "@typescript-eslint/parser",
  plugins: [
    "@typescript-eslint",
  ],
  extends: [
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended"
  ],
  rules: {
    "@typescript-eslint/no-unused-vars": ["error", { "ignoreRestSiblings": true }]
  },
  settings: {
    react: {
      version: "detect"
    }
  }
};

您还可以选择禁用该行的 linting 规则,将其完全添加到它上面的行中:

// eslint-disable-next-line @typescript-eslint/no-unused-vars

您可以使用 ignoreRestSiblings 删除 linter 设置或传递整个对象然后删除 属性。

async someFunction(username: string): Promise<UserDTO> {
    const userEntity = await getUserByUsernameAsync(username);

    if (userEntity ) {
        const {...result} = userEntity;
        delete result.password;
        return result
    }
    
    return null;
}

看来现在您需要将这两条规则添加到您的 .eslintrc.json

argsIgnorePattern 将允许在函数签名中使用下划线参数,而 varsIgnorePattern 将允许在解构中使用下划线。

我们使用模式:^_ 来确保变量名称以下划线开头。

例子

"rules": {
  "no-unused-vars": ["error", {
    "varsIgnorePattern": "^_",
    "argsIgnorePattern": "^_"
  }]
}

文档

备注

在最初的问题中,使用:"ignoreRestSiblings": true 就足够了,因为它与“其余兄弟姐妹”一起使用。

我仍然建议使用下划线前缀作为显式表示法。还值得注意的是,如果没有休息模式,ignoreRestSiblings 将无法解决尝试解构和使用下划线符号时的问题。