首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript和类型安全array.reduce

TypeScript和类型安全array.reduce
EN

Stack Overflow用户
提问于 2020-03-26 10:19:07
回答 1查看 1.8K关注 0票数 1

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

考虑到我有以下接口和数组:

代码语言:javascript
复制
interface Meta {
  name: string;
  value: string;
}

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

在以下三种解决方案中,有哪一种是一般的首选方案,还是有更好的方法来做到这一点?

  1. 在声明reduce函数时使用Record

代码语言:javascript
复制
const metaObj = metaArr.reduce<Record<string, Meta>>((acc, curr) => {
  acc[curr.name] = curr;
  return acc;
}, {});

  1. 声明映射到初始对象:

Meta接口的动态键

代码语言:javascript
复制
const metaObj = metaArr.reduce((acc, curr) => {
  acc[curr.name] = curr;
  return acc;
}, {} as { [key: string]: Meta });

  1. 使用Record转换初始对象:

代码语言:javascript
复制
const metaObj = metaArr.reduce((acc, curr) => {
  acc[curr.name] = curr;
  return acc;
}, {} as Record<string, Meta>);

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-30 09:55:49

虽然这可能是一个微不足道的例子,但仍有一些自以为是的考虑因素有待讨论。偏爱一种表示法而不喜欢另一种表示法本身就是主观的。每个解决方案在功能上都实现了与其他解决方案完全相同的结果,并且每个解决方案的“可测试性”也是等价的。

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

  • reduce<Record<string, Meta>>是您在阅读代码时看到的第一件事情之一,并且没有滚动一个潜在的大缩减投影,很明显,它的形状produce.
  • { [key: string]: Meta }通常不像使用Record<T, R>的第一个点类型声明那样可读,还有更多的东西要用as来实现相同的goal
  • {} as Record<string, Meta>:,“断言”绝不是一种代码气味,但是再次提到第一点,您的代码的读者将需要通过进入函数

的底部寻找减少的结果类型。

通常,当面对这些问题时,所有的道路都会导致代码的可读性。虽然可读性本身也是一种主观追求,但通常情况下,越是明确和包含的东西,就越容易推断出一段代码试图做什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60865038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档