В настоящее время я думаю о двух способах реализации этого (кроме обертки от @NinaSholz, что довольно неплохо):
1.Использование функции curry
, которая объединяет два аргумента:
const foo = (a, b, c) => a + b / c;
function curry(fn, ...args) {
return function(...newArgs) {
const finalArgs = args.map(arg => arg || newArgs.pop());
return fn(...finalArgs);
};
}
const curriedFoo = curry(foo, 1, null, 2);
console.log(curriedFoo(4)) // Should print 1 + 4 / 2 = 3
Здесь мы просто отправляем null
или undefined
вместо параметров, которые мы хотим пропустить, и во втором вызове мы отправляем эти параметры в порядке
2.Использование объектов для именованных параметров
const foo = ({a, b, c}) => a + b / c;
function curry(fn, args) {
return (newArgs) => fn({ ...args,
...newArgs
});
}
const curriedFoo = curry(foo, {
a: 1,
c: 2
});
console.log(curriedFoo({
b: 4
}));
Здесь мы используем преимущества оператора ...
(распространение) и синтаксиса объекта в сигнатуре функции для объединения двух объектов аргумента;