TypeScript and type-safe array.reduce



我正在使用Arrayreduce函数来创建数组的键控对象表示。我已经有了一个有效的解决方案,但注意到有多种方法可以确保输出对象的类型安全。

假设我有以下接口和数组:

interface Meta {
name: string;
value: string;
}
const metaArr: Meta[] = [
{ name: 'a', value: 'hello' },
{ name: 'b', value: 'hi' }
];

在以下三种解决方案中,是否有任何一种通常是首选方案,或者有更好的方法可以做到这一点?

  1. 在声明reduce函数时使用Record
const metaObj = metaArr.reduce<Record<string, Meta>>((acc, curr) => {
acc[curr.name] = curr;
return acc;
}, {});
  1. 为初始对象声明映射到Meta接口的动态键:
const metaObj = metaArr.reduce((acc, curr) => {
acc[curr.name] = curr;
return acc;
}, {} as { [key: string]: Meta });
  1. 使用Record投射初始对象:
const metaObj = metaArr.reduce((acc, curr) => {
acc[curr.name] = curr;
return acc;
}, {} as Record<string, Meta>);

提前谢谢。

尽管这可能是一个微不足道的例子,但仍有一些固执己见的考虑因素需要讨论。偏爱一种表现形式胜过另一种表现方式本身就是主观的。每个解决方案在功能上都实现了与其他解决方案完全相同的结果,并且每个解决方案的"可测试性"也是等效的。

因此,根据您的代码,以下是我可能会考虑的一些事情,以帮助我做出类似的决定:

  • reduce<Record<string, Meta>>是阅读代码时最先看到的东西之一,在不滚动潜在的大缩小投影的情况下,它将产生的形状是显而易见的
  • { [key: string]: Meta }通常不如使用Record<T, R>的第一个点类型声明可读,而且要实现同样的目标,还需要编写更多内容
  • {} as Record<string, Meta>:使用as"断言"决不是代码的味道,但再次提到第一点,代码的读者需要通过函数的底部来寻找reduce的结果类型

通常在遇到这类问题时,所有的道路都会提高代码的可读性。虽然可读性本质上也是一种主观追求,但通常情况下,事物越明确、越包容,就越容易推断出代码块试图做什么

最新更新