gpt4 book ai didi

typescript :将属性从一个对象映射到另一个对象

转载 作者:行者123 更新时间:2023-12-05 06:12:42 29 4
gpt4 key购买 nike

我有以下两种类型和对象。

type TypeA = {
a: number;
b: number;
c: number;
};
type TypeB = {
d: number;
e: number;
c: number;
};
oldObject: { [key: string]: TypeA };

我想将 TypeA 类型对象的属性映射到 TypeB 类型对象。到目前为止,我已经想出了以下内容。

const newObject: { [key: string]: TypeB } = {};

Object.entries(oldObject).forEach(([key, value]) => {
newObject[key] = {
d: value.a,
e: value.b,
c: value.c,
} as TypeB;
});

有没有办法在 typescript 中使用 map 或 reduce 函数来做到这一点?我更希望一开始不必将 {} 分配给 newObject

最佳答案

您可以使用 Object.fromEntries .

type TypeA = {
a: number;
b: number;
c: number;
};
type TypeB = {
d: number;
e: number;
c: number;
};

declare const oldObject: { [key: string]: TypeA };

const newObject: { [key: string]: TypeB } = Object.fromEntries(
Object.entries(oldObject).map(([key, value]) => [
key,
{
d: value.a,
e: value.b,
c: value.c
}
])
);

Playground Link

更详细地说,Object.fromEntries,顾名思义,是 Object.entries 的倒数,采用 [key, value] 元素的数组并创建一个对象,其中的键映射到它们对应的值。

因此,我们像以前一样从 Object.entries 开始,但不是使用 forEach为了填充我们的新对象,我们 map在数组上,将每个 [key, value] 转换为 [key, newValue] 并将生成的数组传递给 Object.fromEntries

请注意,正如 jcalz 所说,Object.fromEntries 是在 ES2019 中引入的。如果您的目标运行时不支持 ES2019,您将需要添加一个 polyfill,例如 npm:object.fromentries并相应地在 tsconfig.json

中指定 "lib": ["ES2019"] 或更高版本

我已经删除了类型断言 as TypeB,因为它既没有必要,更重要的是会抑制错误,例如忘记或拼错由 TypeB 声明的属性。类型推断是 TypeScript 最重要的方面之一。

您对使用 mapreduce 的直觉是非常自然的。我们不仅在这里使用了 map,而且在引入 Object.fromEntries 之前,还经常使用 reduce 来实现与 Object.fromEntries 相同的结果。

关于 typescript :将属性从一个对象映射到另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63561712/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com