使用数组减少打字稿为累加器提供类型
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函数数组,并使用给定的累加器减少结果