"inStock"被分配了一个值,但从未使用过未使用的变量



我正在尝试重构一些代码,并希望使用解构使代码更容易阅读。我正在传递一个对象到remove()函数中,但是其中一个变量返回:

'inStock'被分配了一个值,但从未使用过

根据eslint文档:

'对自身进行修改的读取不被视为使用。'https://eslint.org/docs/rules/no-unused-vars

我想知道是否有办法解决这个问题没有:

  • 修改eslint (no-unused-vars) ?
  • 添加/* eslint-disable no-unused-vars */comments inline ?

Thanks in advance

重构前:

remove(product) {
if (product.quantity > 0) {
product.quantity --;
product.inStock ++;
}
}

重构后:

remove({ quantity, inStock }) {
if (quantity > 0) {
quantity --;
inStock ++;
}
}

问题

你的重构是基于quantity--inStock++product.quantity--product.inStock++具有相同行为的误解。这种误解的核心是认为解构的场仍然指的是对象上的场。让我们来看看解构到底是什么。

以下面的例子为例,使用解构:

const obj = { foo: 0 };
const { foo } = obj;

如果没有解构,它看起来像这样:

const obj = { foo: 0 };
const foo = obj.foo;

解构语法只是第二个例子的一个快捷方式。

这说明了解构定义了一个新变量并赋值(不是引用)要解构为该变量的字段。当您对该变量进行更改时,您只会更改变量的值,而不会更改对象字段的值。这是一个可运行的例子,你会看到obj.foo没有改变0,即使我们增加foo,它已经从obj中解构:

const obj = { foo: 0 };
var { foo } = obj;
foo++;
console.log(obj); // { "foo": 0 }

回到你的linting错误:linter是正确的,不仅提出了变量未使用的事实,而且揭示了我已经解释过的这个问题。

<标题>

解决方案我能想到的直接解决办法有两个:

  1. 不变性。在您的示例中,虽然解构确实缩短了代码的数量,但它可能会引入混乱,不知道发生了什么变化,并使代码更难以理解——您自己已经经历过了。

  2. 将递增/递减值重新赋值给对象。需要在操作数前加上操作符前缀。因为这会在之后返回值操作。后置返回之前的值操作(即原始值)。

remove({ quantity, inStock }) {
if (quantity > 0) {
product.quantity = --quantity;
product.inStock = ++inStock;
}
}

如果您曾经学习过函数式编程,特别是纯函数式编程,那么您可能可以将其他模式应用于您的场景,但这超出了本文的范围。这些模式不会进行改变,这样可以更容易地理解数据是如何流经系统和被系统改变的。

最新更新