У меня есть функция, которая принимает функцию преобразования строки и объект и применяет преобразование ко всем ключам, возвращая полученный объект.
В частности, я использую Ramda
Вот моя функция (нетипизированная для ясности).
const renameBy = R.curry(
(fn, obj) => R.pipe(
R.toPairs,
R.map([k, v] => [fn(k), v]),
R.fromPairs
)(obj)
);
Я хорошо осведомлен о проблемах, которые может вызвать каррирование, поэтому я действительно только ищу решения, касающиеся основной функции (и, возможно, второйунарная функция, renameBy (fn)) и разрешение более приятного возвращаемого типа, чем текущий R.Dictionary, который в принципе никогда ничего не соответствует.
Я искал здесь, имея дело с переименованием определенных ключейздесь объект и , имеющий дело с рекурсивным, глубоким переименованием вложенного объекта , но ни один из них не совсем соответствует тому, что я ищу.
Пример использования
const input = {
foo_bar: "foobar",
bar: "bar",
bar_foo: "barfoo"
}
const camelize = (paramName) =>
paramName.replace(
/_(.?)/g,
$1 => $1.substr(1).toUpperCase()
);
renameBy(camelize, input)
const expectedOutput = {
fooBar: "foobar",
bar: "bar",
barFoo: "barfoo"
}
Возможно, я мог бы использовать что-то вроде
function renameBy<
F extends (str: string) => string,
N extends string[],
M extends Record<string, any>
>(fn: F, obj: M): { [P in N]: M[keyof M] }
{...}
Но я не могу заставить его работать.