Исправить ошибки линтера ESLint no-plusplus и no-param-reassign при добавлении в аккумулятор в функции уменьшения

Приведите этот код в TypeScript:

      const res = arr.reduce((acc, cur) => (cur.id ? ++acc : acc), 0);

Как мне сделать так, чтобы линтер не выдавал эти две ошибки?

(параметр) acc: number Используемый унарный оператор '++'. eslint no-plusplus

Присвоение функции параметру acc. eslint no-param-reassign

1 ответ

А <tcode id="84035"></tcode>обратный вызов принимает аккумулятор и текущее значение в качестве аргументов и возвращает аккумулятор для следующей итерации или аккумулятор в качестве результата, если следующей итерации нет. Нет причин изменять какие-либо аргументы.

Есть несколько аргументов в пользу отказа от изменения параметров <em>в целом</em> , и поэтому ESLint жалуется на это с помощью правила .

В <tcode id="84037"></tcode>правило , кроме того, запрещает синтаксис вроде ++acc.

Поскольку для начала нет необходимости вносить изменения, минимальное исправление для обеих ошибок:

         const res = arr.reduce((acc, cur) => (cur.id ? acc + 1 : acc), 0);
//                                                ~~~~^~~              Replace `++acc` by `acc + 1`

Этот возврат увеличивается на 1если истинно, а текущее, в противном случае, как и ожидалось . Ваша версия изменяет текущий в дополнение к возврату увеличенного acc, но для этого нет оснований.


Если вы используете ESLint, вы должны знать правила. Вы не можете написать код, на который жалуется ESLint, а затем запутаться, почему ESLint жалуется на ваш код. У каждого правила есть собственная статья, в которой объясняется его обоснование, перечисляются альтернативы и объясняется, как правило можно изменить или отключить.

Например, вы можете отключить no-param-reassign правило

  • включив комментарий // eslint-disable no-param-reassign в верхней части вашего файла,
  • или же // eslint-disable-next-line no-param-reassign на одну строку выше использования,
  • или же // eslint-disable-line no-param-reassign в строке после использования,
  • или отключив его в своем .eslintrc файл.

Также есть правило, запрещающее условные выражения и некоторые варианты . Вы можете еще больше упростить свою функцию, чтобы избежать даже этого:

      const res = arr.reduce((acc, cur) => acc + Number(Boolean(cur.id)), 0);

Это будет иметь ту же семантику, но все еще не совсем понятно, какое условие должно быть. Лучше всего сделать это немного более явным (особенно в TypeScript), например cur.hasOwnProperty("id") или же cur.id !== 0 или же cur.id !== ""в зависимости от того, что cur.idможет быть. Затем Booleanзвонок больше не нужен; например, если вы хотите посчитать, сколько объектов в arr есть id собственное свойство, используйте вместо этого:

      const res = arr.reduce((acc, cur) => acc + Number(cur.hasOwnProperty("id")), 0);

или это:

      const res = arr.filter((cur) => cur.hasOwnProperty("id")).length;

Если вы все еще хотите использовать свою исходную проверку на ложность / правдивость , код можно сократить до одного из них, используя деструктурирующее присваивание :

      const res = arr.reduce((acc, {id}) => acc + Number(Boolean(id)), 0);
      const res = arr.filter(({id}) => id).length;
Другие вопросы по тегам