我正在尝试为下面包含的代码解决这两个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 }
至于第一个错误,我不知道如何修复它......
应该提到这不是我的代码(我只是想解决它)所以我可能会遗漏一些东西......
答案 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 }