我使用数组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>);提前谢谢。
发布于 2020-04-30 09:55:49
虽然这可能是一个微不足道的例子,但仍有一些自以为是的考虑因素有待讨论。偏爱一种表示法而不喜欢另一种表示法本身就是主观的。每个解决方案在功能上都实现了与其他解决方案完全相同的结果,并且每个解决方案的“可测试性”也是等价的。
因此,根据您的代码,下面是一些我可能会考虑的事情,以便帮助我做出类似的决定:
reduce<Record<string, Meta>>是您在阅读代码时看到的第一件事情之一,并且没有滚动一个潜在的大缩减投影,很明显,它的形状produce.{ [key: string]: Meta }通常不像使用Record<T, R>的第一个点类型声明那样可读,还有更多的东西要用as来实现相同的goal{} as Record<string, Meta>:,“断言”绝不是一种代码气味,但是再次提到第一点,您的代码的读者将需要通过进入函数的底部寻找减少的结果类型。
通常,当面对这些问题时,所有的道路都会导致代码的可读性。虽然可读性本身也是一种主观追求,但通常情况下,越是明确和包含的东西,就越容易推断出一段代码试图做什么。
https://stackoverflow.com/questions/60865038
复制相似问题