【发布时间】:2020-04-30 17:55:49
【问题描述】:
我正在使用 Array reduce 函数来创建数组的键控对象表示。我已经有了一个可行的解决方案,但注意到有多种方法可以确保输出对象是类型安全的。
鉴于我有以下接口和数组:
interface Meta {
name: string;
value: string;
}
const metaArr: Meta[] = [
{ name: 'a', value: 'hello' },
{ name: 'b', value: 'hi' }
];
在以下三种解决方案中,通常是首选它们中的任何一种,还是有更好的方法来做到这一点?
- 在声明
reduce函数时使用Record:
const metaObj = metaArr.reduce<Record<string, Meta>>((acc, curr) => {
acc[curr.name] = curr;
return acc;
}, {});
- 为初始对象声明映射到
Meta接口的动态键:
const metaObj = metaArr.reduce((acc, curr) => {
acc[curr.name] = curr;
return acc;
}, {} as { [key: string]: Meta });
- 使用
Record转换初始对象:
const metaObj = metaArr.reduce((acc, curr) => {
acc[curr.name] = curr;
return acc;
}, {} as Record<string, Meta>);
提前致谢。
【问题讨论】:
-
我会使用你的第一种方法。因为,按原样使用(至少在我看来)是一个可能的陷阱。因为它“覆盖”了类型系统。旁注:如果你仍然想使用 as cast,你应该使用 Record
东西。其他任何事情迟早都会落在你的脚下
标签: typescript