首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Typescript中键入用于重命名对象键的函数

如何在Typescript中键入用于重命名对象键的函数
EN

Stack Overflow用户
提问于 2019-06-14 00:03:26
回答 1查看 328关注 0票数 0

我有一个函数,它接受一个字符串转换函数和一个对象,并将转换应用于所有键,返回结果对象。

特别是,我使用的是Ramda

以下是我的函数(为清楚起见,未类型化)。

代码语言:javascript
复制
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 objecthere, dealing with recursive, deep nested-object renaming,但它们似乎都不是我想要的。

用法示例

代码语言:javascript
复制
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"
}

我可能会用到像这样的东西

代码语言:javascript
复制
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] }
      {...}

但我不能让它正常工作。

EN

回答 1

Stack Overflow用户

发布于 2021-08-04 14:55:20

这个问题已经有一段时间没有讨论过了。最近,我面临着一个类似的任务。无论如何,这里有一个使用TS 4.1+的可能的解决方案

代码语言:javascript
复制
// 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}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56584500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档