我有一个函数,它接受一个字符串转换函数和一个对象,并将转换应用于所有键,返回结果对象。
特别是,我使用的是Ramda
以下是我的函数(为清楚起见,未类型化)。
const renameBy = R.curry(
(fn, obj) => R.pipe(
R.toPairs,
R.map([k, v] => [fn(k), v]),
R.fromPairs
)(obj)
);我很清楚currying可能导致的问题,所以我实际上只是在寻找解决核心函数(以及可选的第二个一元函数renameBy(fn))的解决方案,并解决比当前R.Dictionary更好的返回类型,因为它基本上永远不会匹配任何内容。
我一直在寻找here, dealing with renaming specific keys of an object和here, dealing with recursive, deep nested-object renaming,但它们似乎都不是我想要的。
用法示例
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] }
{...}但我不能让它正常工作。
发布于 2021-08-04 14:55:20
这个问题已经有一段时间没有讨论过了。最近,我面临着一个类似的任务。无论如何,这里有一个使用TS 4.1+的可能的解决方案
// helper types
type BaseT = Record<string, unknown> // object constraint
type BaseM = Record<string, string> // mapping constraint
type KVs<T extends BaseM> = keyof T | T[keyof T] // keys and values
type Remap<T extends BaseT, M extends BaseM> =
& {[K in keyof M & keyof T as M[K]]: T[K]} // new keys
& {[K in keyof T as Exclude<K, KVs<M>>]: T[K]} // unchanged keys
type Result = Remap<{a: 1; b: '2'}, {a: 'c'}>
// type Result = {b: '2'} & {c: 1}https://stackoverflow.com/questions/56584500
复制相似问题