Как набрать функцию для переименования ключей объекта в Typescript - PullRequest
0 голосов
/ 13 июня 2019

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

В частности, я использую 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] }
      {...}

Но я не могу заставить его работать.

...