переключение на Lodash / fp из Lodash приводит к ошибкам машинописи

#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 и анализирует отдельные свойства и т.д…