Функциональный JavaScriptФункции-декораторыhard

Именованные аргументы

Иногда бывает, что функция принимает много аргументов, причем среди них много отднотипных, часто это числа и булеаны. Тогда не всегда понятно, что каждый аргумент означает и в каком порядке они передаются.

// В определении функции всё понятно по названиям function reformat( str, normalizeCase, upperCaseFirstLetter, divideByCamelHumps, wordSeparator, ) { /*...*/ } // А в момент вызова уже непонятно // Что значат false и true? reformat("This is a long String!", true, false, true, " ");

В таком случае иногда вместо нескольких аргументов используется объект:

function reformat({ str, normalizeCase, upperCaseFirstLetter, divideByCamelHumps, wordSeparator, }) { /*...*/ } // В момент вызова теперь тоже понятно reformat({ str: "This is a long String!", normalizeCase: true, upperCaseFirstLetter: false, divideByCamelHumps: true, wordSeparator: " ", });

Реализуйте функцию-декоратор, которая будет превращать функцию с обычными аргументами в функцию, принимающую объект.

Можно считать, что в функциях не используются дефолтные аргументы и деструктуризация.

Примеры

Обычная функция:

function sum(a, b) { return a + b; } const sum2 = withNamedArgs(sum); console.log(sum2({a: 1, b: 2})); // 3

Стрелочная функция:

const map = (arr, cb) => arr.map(cb); const map2 = withNamedArgs(map); console.log(map2({arr: [1, 2, 3], cb: x => x * 2})); // [2, 4, 6]