【问题标题】:give type to accumulator with array reduce typescript使用数组减少打字稿为累加器提供类型
【发布时间】:2020-04-06 20:30:01
【问题描述】:

我正在使用一些函数生成具有时间间隔的对象,它返回 ["00:00","00:30","01:00"]...,但为了我的目的,我需要 obj-map {{"00:00": "00:00"}, {"00:30":"00:30"}, {"01:00":"01:00"}} 我在下面输入 reduce func 时遇到问题,如何输入 acc 或 func 的返回值以避免使用 any 作为 acc 的类型?

generateTimeIntervals(0, 1440, 30).reduce((acc, val) => {
  acc[val] = val;
  return acc;
}, {})

【问题讨论】:

  • 您的预期输出无效。对象数组有意义,但对象的对象没有意义。
  • 记得在箭头函数的花括号周围加上括号。否则它不会返回一个对象,而是将它们视为一个没有返回值的代码块。
  • @evolutionxbox 这里的箭头函数没有隐式返回
  • 您正在创建一个以"00:00""00:30"etc 作为键的对象。你想要一个对象数组吗?
  • @adiga 单行格式骗了我。

标签: javascript arrays typescript reduce


【解决方案1】:

如何输入 acc 或 func 的返回值以避免使用 any 作为 acc 的类型?

您可以通过提供您提供的 {} 种子的类型来做到这一点,例如 Record<string, string>(但确切的类型不是这里的重点,重点是分配类型是您如何按照你的要求做):

let result = generateTimeIntervals(0, 1440, 30).reduce((acc, val) => {
  acc[val] = val;
  return acc;
}, {} as Record<string, string>)

TypeScript 将能够充分遵循 reduce 调用的逻辑,以便在此基础上为您键入返回值。


对于您的 reduce 代码是否也需要一些调整的问题,我并不完全清楚,但这是一个不同的问题......

【讨论】:

  • reduce 工作正常,只是累加器类型是问题,Thnx 我现在明白我应该做什么了..
【解决方案2】:

【讨论】:

  • @AlexeySh。 generateTimeIntervals 没有在任何地方定义;当然它不会编译。
  • 谢谢,这似乎是最惯用的答案
猜你喜欢
  • 2019-02-08
  • 2017-09-22
  • 2015-05-18
  • 2022-01-03
  • 2018-08-05
  • 2019-01-13
  • 2021-10-24
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多