Бросок шумихи TyperError: Ожидаемая функция при использовании lodash pipe / flow - PullRequest
0 голосов
/ 27 мая 2019

У меня следующий код:

function sort() {
   let array1 = [{ value:1 }, { value:2 }, { value:3 }];
   let array2 = [{ code:1 }, { code:2 }, { code:3 }];
   const constructSortedArray = pipe(
     sortBy(array1, element => element.value),
     sortedArray1 => sortedArray1.concat(array2)
   );
   return constructSortedArray();
 }

Я использую lodash/fp/flow в качестве псевдонима трубы и lodash/sortBy.При запуске кода функция работает нормально, но при тестировании кода с помощью jest я получаю следующую ошибку на pipe:

TypeError: Expected a function 

> 73 |     const constructSortedArray = pipe(

Я попытался установить testEnviornment как jsdom и nodeно это не полезно.automock также отключен для шуток.

Любая помощь приветствуется.

1 Ответ

1 голос
/ 27 мая 2019

Когда вы вызываете sortBy, он возвращает результаты, а не функцию.Вы можете исправить это, используя функцию со стрелкой, и вызвав функцию piped с array1 в качестве аргумента.

Примечание: у lodash нет метода _.pipe() (он называется _.flow()), но есть lodash /fp делает (это псевдоним _.flow()).

const { flow, sortBy } = _;

function sort() {
  let array1 = [{ value:1 }, { value:2 }, { value:3 }];
  let array2 = [{ code:1 }, { code:2 }, { code:3 }];
  const constructSortedArray = flow(
    arr => sortBy(arr, element => element.value),
    sortedArray1 => sortedArray1.concat(array2)
  );
  return constructSortedArray(array1);
}
 
console.log(sort());
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

Для пользователя _.partialRight() будет более понятный вариант возврата функции с большинством правых параметров, уже примененных:

const { flow, partialRight, sortBy, concat } = _;

function sort() {
  let array1 = [{ value:1 }, { value:2 }, { value:3 }];
  let array2 = [{ code:1 }, { code:2 }, { code:3 }];
  
  const constructSortedArray = flow(
    partialRight(sortBy, element => element.value),
    partialRight(concat, array2)
  );

  return constructSortedArray(array1);
}

console.log(sort());
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

И самым чистым способом будет пользователь lodash / fp, поскольку все функции автоматически каррируются, а параметры находятся в правильном порядке:

const { pipe, partialRight, sortBy, concat } = _;

function sort() {
  let array1 = [{ value:1 }, { value:2 }, { value:3 }];
  let array2 = [{ code:1 }, { code:2 }, { code:3 }];
  
  const constructSortedArray = pipe(
    sortBy(element => element.value),
    partialRight(concat, [array2])
  );

  return constructSortedArray(array1);
}

console.log(sort());
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
...