跳至内容

unicorn/no-useless-spread 正确性

此规则默认打开。
🛠️ 此规则已针对某些违规提供自动修复功能。

作用

禁止在以下不必要的情况下使用展开语法

  • 展开数组文字作为数组文字的元素
  • 展开数组文字作为调用或 new 调用的参数
  • 展开对象文字作为对象文字的属性
  • 使用展开语法克隆内联创建的数组

为什么这不好?

  • 以下内置项接受可迭代对象,因此不必将可迭代对象转换为数组

    • Map 构造函数
    • WeakMap 构造函数
    • Set 构造函数
    • WeakSet 构造函数
    • TypedArray 构造函数
    • Array.from(…)
    • TypedArray.from(…)
    • Promise.{all,allSettled,any,race}(…)
    • Object.fromEntries(…)
  • for…of 循环可以迭代任何可迭代对象,而不仅仅是数组,因此不必将可迭代对象转换为数组。

  • yield* 可以委托给其他可迭代对象,因此不必将可迭代对象转换为数组。

示例

javascript
const array = [firstElement, ...[secondElement], thirdElement];
const object = { firstProperty, ...{ secondProperty }, thirdProperty };
foo(firstArgument, ...[secondArgument], thirdArgument);
const object = new Foo(firstArgument, ...[secondArgument], thirdArgument);
const set = new Set([...iterable]);
async function foo() {
  const results = await Promise.all([...iterable]);
}
for (const foo of [...set]);
function* foo() {
  yield* [...anotherGenerator()];
}
function foo(bar) {
  return [...bar.map((x) => x * 2)];
}

// Pass

const array = [firstElement, secondElement, thirdElement];
const object = { firstProperty, secondProperty, thirdProperty };
foo(firstArgument, secondArgument, thirdArgument);
const object = new Foo(firstArgument, secondArgument, thirdArgument);
const array = [...foo, bar];
const object = { ...foo, bar };
foo(foo, ...bar);
const object = new Foo(...foo, bar);
const set = new Set(iterable);
async function foo() {
  const results = await Promise.all(iterable);
}
for (const foo of set);
function* foo() {
  yield* anotherGenerator();
}
function foo(bar) {
  return bar.map((x) => x * 2);
}

引用

在 MIT 许可证下发布。