解决由于“no-param-reassign”和“prefer-rest-params”引起的ESLint错误

时间:2018-02-27 13:59:38

标签: javascript

我正在尝试为下面包含的代码解决这两个ESLint错误,但无法理解它。

9   error  Assignment to property of function parameter 'opts'  no-param-reassign
10  error  Use the rest parameters instead of 'arguments'       prefer-rest-params

这是代码段:

 8  initialize(opts) {
 9    opts.hasStar = true;
10    AbstractResultView.prototype.initialize.apply(this, arguments);
11  }

我已经尝试过这些第二个错误,但到目前为止还没有运气:

 8  initialize(...args, opts) {
 9    opts.hasStar = true;
10    AbstractResultView.prototype.initialize.apply(this, args);
11  }

 8  initialize(opts, ...args) {
 9    opts.hasStar = true;
10    AbstractResultView.prototype.initialize.apply(this, args);
11  }

至于第一个错误,我不知道如何修复它......

应该提到这不是我的代码(我只是想解决它)所以我可能会遗漏一些东西......

4 个答案:

答案 0 :(得分:0)

第一个错误就在这里,因为在您的eslint配置中,您使用以下内容:

no-param-reassign: ["error", { "props": true }]

由于"props": true,如果此对象是函数的参数,则无法重新分配对象属性。你在这里的选择是有限的。您可以删除该行或更改eslint配置。

有关此特定规则的更多信息:https://eslint.org/docs/rules/no-param-reassign

您可以在此处获得有关第二个错误的更多信息:https://eslint.org/docs/rules/prefer-rest-params

但根据文档,您的第二个代码(initialize(opts, ...args) {)应该可以解决问题。

答案 1 :(得分:0)

尝试一下:

initialize(opts, ...args) {
    AbstractResultView.prototype.initialize.apply(
        this,
        [
            {
                ...opts,
                hasStar: true
            },
            ...args
        ]
    );
}

这将:
1.首先获取arg并更改其属性hasStar 而无需修改源对象
2.将所有参数(包括已修改的第一个参数)传递给initialize

答案 2 :(得分:-1)

在第一种情况下,eslint试图避免修改函数参数,这是一种称为side effect的坏习惯。

第二种情况,eslint试图避免在spread operator使用后使用参数。

错:

initialize(opts) {
  opts.hasStar = true;
  AbstractResultView.prototype.initialize.apply(this, arguments);
}

有各种方法可以做到这一点。我'会尝试这样做:

initialize(...args) {
  AbstractResultView.prototype.initialize.apply(this, args);
}

initialize(opts); // call method
opts.hasStar = true; // after assign a prop to it

所有这一切都是以eslint的观点出发的。如果您愿意,可以按下此警告并继续执行代码。

答案 3 :(得分:-1)

最终,我找到了解决这两个问题的解决方案:

 8  initialize(...args) {
 9    // with destructuring:
10    const [opts] = args;  
11    // or without desctructuring:
12    // const opts = args[0];
13    opts.hasStar = true;
14    AbstractResultView.prototype.initialize.apply(this, args);
15  }