需要一个类型魔术来键入替换对象键的函数的返回值



这里的问题是,将返回的对象类型需要包含O(即我们的初始输入)中的所有键,而不包含R中包含的键。此外,它还应该包含R中的值,以替换O中省略的键。

现在的函数是这样的:

type JSObject = {
[key: string | number | symbol]: unknown
}
export function replace<O extends JSObject, R extends { [K in keyof O]?: string }>(
object: O,
replacement: R
): Omit<O, keyof R> {
const regex = new RegExp(`(${Object.keys(replacement).join('|')})`, 'g')
const stringify = JSON.stringify(object).replace(regex, (match) => replacement[match] ?? match)
return JSON.parse(stringify)
}

是的,TS确实有类型键映射

type A = { id: 1, foo: 2, baz: 3 }
type B = { foo: 'bar' }
type Replace<O, R extends Record<any, PropertyKey>> = {
[K in keyof O
as K extends keyof R ? R[K] : K
]: O[K]
}
type C = Replace<A, B>
//   ^?
// type C = { id: 1; bar: 2; baz: 3; }

游乐场


编辑:这是一个适当的实现,操场(注意:它不json克隆值)

function renameKeys<O extends { [s: string]: unknown; }, R extends { [s: string]: PropertyKey; }>(
object: O,
replacement: R
): Replace<O, R> {
return Object.fromEntries(
Object.entries(object)
.map(([key, value]) => [ Object.hasOwn(replacement, key) ? replacement[key] : key, value])
) as Replace<O, R>
}

相关内容

  • 没有找到相关文章

最新更新