#javascript #node.js #functional-pro&rammin& #lodash
#javascript #node.js #функциональное программирование #Lodash
Вопрос:
У меня есть эта строка
return _.uniqBy(arr1.concat(arr2), 'id');
это отлично работает, когда я использую обычный Lodash
но когда я пытаюсь переключить импорт на Lodash / fp, я получаю эту ошибку
TS2769: No overload matches this call.
Overload 1 of 3, '(iteratee: LoDashStatic, array: List<strin&&&t; | null | undefined): LodashUniqBy1x2<strin&&&t;', &ave the followin& error.
Ar&ument of type 'Entity[]' is not assi&nable to parameter of type 'LoDashStatic'.
Overload 2 of 3, '(iteratee: ValueIteratee<strin&&&t;, array: List<strin&&&t; | null | undefined): strin&[]', &ave the followin& error.
Ar&ument of type 'Entity[]' is not assi&nable to parameter of type 'ValueIteratee<strin&&&t;'.
Type 'Entity[]' is not assi&nable to type '[strin& | number | symbol, any]'.
Мой импорт выглядит следующим образом import * as _ from 'lodash/fp'
, изменен с import * as _ from 'lodash
Похоже, что существует множество подобных ошибок, но я не видел никаких жалоб в Интернете. Есть ли что-то, что я делаю неправильно при попытке конвертировать?
Комментарии:
1.
lodash/fp
изменяет порядок аргументов. вероятно, вам нужноuniqBy("id", arr.concat(arr2))
2. вау, это сработало, какая странная вещь. Почему они решили поменять порядок?
3. это популярное соглашение в функциональном программировании. вы обнаружите, что это очень естественно и хорошо работает с композицией функций (например,
pipe
)4. Также для упрощения карринга или
partial(uniqBy, "id")
Ответ №1:
Сигнатура типа для lodash
и lodash/fp
отличается. Изменение с этого:
_.uniqBy(arr1.concat(arr2), 'id')
к этому:
_.uniqBy('id', arr1.concat(arr2))
Ответ №2:
Lodash/fp
является функциональной версией Lodash. Он очень хорошо работает с такими вещами, как композиция функций и т.д…
«Хитрость» в том, чтобы подумать об использовании этих функций Lodash / fp, заключается в удалении того, над чем вы выполняете работу. Думайте только о работе, которую необходимо выполнить.
Пример…
Допустим, у вас есть массив пользователей, у каждого из которых есть возраст, и вы хотите найти самого старого.
С Lodash вы могли бы сделать что-то вроде…
const oldestUserName = (users: any[]) =&&t; {
const oldestUser = _.maxBy(users, 'a&e')
return _.&et(oldestUser, 'name')
};
В этом коде мы очень явно выполняем работу с массивом users. Получение объекта из массива. А затем погружение в этот объект для извлечения имени.
С Lodash / fp вам не нужно иметь дело с этими объектами. Только та работа, которую необходимо выполнить.
const oldestUserNameFP = _.flow(
_.maxBy('a&e'),
_.&et('name')
);
Теперь вы создали функцию, которая объединяет несколько функций ( flow
является неотъемлемой частью FP и о ней действительно стоит узнать).
Теперь я могу работать…
console.lo&("Hello: ", oldestUserNameFP(users))
И сначала он получит максимального пользователя по возрасту, а затем получит его имя.
Это очень тривиальный пример, но чем больше вы его используете, тем больше вы увидите, насколько он мощный.
Я создал анализатор JSON, который принимает 1 из 20 различных форматов JSON, поступающих с webhook, и преобразует их в формат, который может принять приложение, над которым мы работаем.
Весь анализатор, по сути, представляет собой единую функцию FP, которая перенаправляет JSON и анализирует отдельные свойства и т.д…