使用数组减少打字稿为累加器提供类型

Posted

技术标签:

【中文标题】使用数组减少打字稿为累加器提供类型【英文标题】: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 单行格式骗了我。 【参考方案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】:

您可以将类型作为参数传递给reduce

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

在此处查看示例:https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABAcwKZlQJwIZVQFRgFtUBJMPTAN2wBsBnACmwC4wQiAjLAGkU5aJ2XXogiDh3TAEpEAbwCwAKESJMqKCExIA2stWqAylEwwwyZtL7HT5xpyuIbZixGn7EAXWUBfZctoNNVR6EFooRABeFHQsXAJiMgosGgZGAAY+AEYAFhzMxABmdOkAOnUAExAIVAAeACVUCDhMCtr6Exc+DttkAD4+xmYICD5U2Ui++Q9sEZ1UzyjEVIBuD3VNbURZiDWlHz45H3clZWawejhA0to4CwAidVDw+74nsKhpIA

【讨论】:

@AlexeySh。 generateTimeIntervals 没有在任何地方定义;当然它不会编译。 谢谢,这似乎是最惯用的答案

以上是关于使用数组减少打字稿为累加器提供类型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用打字稿为反应测试库设置智能感知

打字稿转换 Object.entries 将派生字符串数组减少为文字类型

javascript accumulate():按顺序执行promises或promise-returns函数数组,并使用给定的累加器减少结果

将数组的并行流减少为单个数组

减少使用特殊方法的课堂打字

数组减少javascript打字稿