Исправить ошибки линтера 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;