我正在try 创建一个函数来反转所提供的对象.

例如,我有这样一个物体

{
 a: "aee",
 b: "bee",
 c: "cee"
}

我想把它做成

{
 aee: "a",
 bee: "b",
 cee: "c"
}

使用如下函数:

mapSelf(myObject)

JavaScript中的逻辑很简单:

function mapSelf(object) {
  const result = {};
  for (const [key, value] of Object.entries(object)) {
    result[value] = key;
  }
  return result;
}
const test = mapSelf({
  a: 'aee',
  b: 'bee',
  c: 'cee',
})
console.log(test)
// {
//   "aee": "a",
//   "bee": "b",
//   "cee": "c"
// }

在Typescript 中做这件事几乎是可行的!

function mapSelf<const T extends Record<string, string>>(
  object: T
): Record<T[keyof T], keyof T> {
  const result: any = {}
  for (const [key, value] of Object.entries(object)) {
    result[value] = key
  }
  return result
}

const test = mapSelf({
  a: 'aee',
  b: 'bee',
  c: 'cee',
})

但是,我在最终输出中丢失了键和它们的值之间的关系.

当我试图徘徊在H以上时

const H = test.aee

我把H推定为

const H: "a" | "b" | "c"

我想让H等于它对应的键,在这种情况下,H应该被推断为"a"

推荐答案

你要找的型号是key-remapped type-{[K in keyof T as T[K]]: K}.这使您可以为T的每个属性K Select 一个新密钥:

function mapSelf<const T extends Record<string, string>>(
    object: T
): { [K in keyof T as T[K]]: K } {
    const result: any = {}
    for (const [key, value] of Object.entries(object)) {
        result[value] = key
    }
    return result
}

const test = mapSelf({
    a: 'aee',
    b: 'bee',
    c: 'cee',
})
/* const test: {
    readonly aee: "a";
    readonly bee: "b";
    readonly cee: "c";
} */

Playground link to code

Javascript相关问答推荐

将数据从strapi提取到next.js,但响应延迟API URL

如何访问Json返回的ASP.NET Core 6中的导航图像属性

扫描qr code后出错whatter—web.js

使用JavaScript重新排序行

Snowflake JavaScript存储过程返回成功,尽管预期失败

成功完成Reducers后不更新状态

我的角模板订阅后不刷新'

S文本内容和值不必要的不同

使用js构造一个html<;ath&>元素并不能使其正确呈现

同一类的所有div';S的模式窗口

Reaction组件在本应被设置隐藏时仍显示

Reaction-SWR-无更新组件

Phaserjs-创建带有层纹理的精灵层以自定义外观

React:防止useContext重新渲染整个应用程序或在组件之间共享数据而不重新渲染所有组件

MongoDB中的嵌套搜索

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

如何将值从后端传递到前端

如何在单击链接时设置一个JavaScript变量(以打开弹出窗口的特定部分)

使用重新 Select 和对象理解 Select 器备忘

Select 所有输入.值