打字稿对象解构被 ESLint no-unused-vars 规则捕获

nob*_*are 15 javascript typescript eslint typescript-eslint

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

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

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

    return null;
}
Run Code Online (Sandbox Code Playgroud)

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

但是,linter 发出警告:

warning  'password' is assigned a value but never used      @typescript-eslint/no-unused-vars
Run Code Online (Sandbox Code Playgroud)

对象解构正在分配passport给一个值和result另一个对象值,并且passport是一个未被使用的值。如何解决此问题以通过 linter?

Tel*_*per 21

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

例子:

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"
    }
  }
};

Run Code Online (Sandbox Code Playgroud)

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

// eslint-disable-next-line @typescript-eslint/no-unused-vars
Run Code Online (Sandbox Code Playgroud)


CTS*_*_AE 15

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

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

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

例子

"rules": {
  "no-unused-vars": ["error", {
    "varsIgnorePattern": "^_",
    "argsIgnorePattern": "^_"
  }]
}
Run Code Online (Sandbox Code Playgroud)

文档

笔记

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

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

  • `varsIgnorePattern` 正是我正在寻找的! (2认同)

Luk*_*uke 8

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

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

    if (userEntity ) {
        const {...result} = userEntity;
        delete result.password;
        return result
    }
    
    return null;
}
Run Code Online (Sandbox Code Playgroud)