Как определено, эта функция принимает любое количество аргументов, которые могут быть чем угодно. Да, это включает в себя функции, но также включает, например, числа. Что произойдет, если вы позвоните pipe(5)
?
Вместо этого, похоже, что вы хотите ограничить его только функциями. Это просто сделать - просто замените $ReadOnlyArray<mixed>
на ReadOnlyArray<mixed => mixed>
. С этим изменением проверяется тип функции.
Однако, это все еще не очень полезный тип. Будет неприятно использовать результат, так как это mixed
. Это означает, что Flow ничего не знает о его типе, поэтому вам придется уточнить его перед использованием. И, уточнения во время выполнения могут только go.
Эта функция была бы намного более полезной, если бы она была полиморфной c:
const pipe = <T>(...fns: $ReadOnlyArray<T => T>): (T => T) => {
return (param) => {
return fns.reduce((result, fn) => fn(result), param);
};
}
function plus5(x) { return x + 5; }
function times3(x) { return x * 3; }
const plus5times3 = pipe(plus5, times3);
(plus5times3(6): number);
// expected error
(plus5times3(6): string);
( детская площадка )
Теперь вы можете позвонить и получить полезный результат. Как написано, вы можете иногда получать ошибочные ошибки типа из-за логического вывода типа, но это обычно решается добавлением дополнительных аннотаций типов. В частности, я рекомендую добавить аннотацию типа к результату compose
, например
const plus5times3: number => number = pipe(plus5, times3);