使用数组reduce函数为累加器指定类型,TypeScript

16

我正在使用某个函数按时间间隔生成对象。它返回["00:00", "00:30", "01:00"]...,但是为了我的目的,我需要将其转换成对象映射 {{ "00:00": "00:00" }, { "00:30": "00:30" }, { "01:00": "01:00" }}

我在编写下面的 reduce 函数时遇到了问题。如何为acc或函数的返回值指定类型,以避免将any用作acc的类型?

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

3
你的期望输出无效。对象数组是有意义的,但是对象中嵌套对象则不太合适。 - Mohammad Usman
请记得在箭头函数的大括号周围加上括号,否则它将不会返回一个对象,而是将其视为一个没有返回值的代码块。 - evolutionxbox
3
@evolutionxbox 这里的箭头函数没有隐式返回。 - adiga
1
您正在创建一个以“00:00”、“00:30”等为键的单个对象。您是否想要一个对象数组? - adiga
@adiga,那个单行格式把我骗了。 - evolutionxbox
2个回答

32

我如何在避免使用任何类型作为"acc"的类型时,输入"acc"或函数的返回值?

您可以通过提供您提供的 {} 种子的类型来实现,例如Record<string, string>(但确切的类型并不是关键,关键是分配一个类型是您所要求的方法):

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

通过reduce调用的逻辑,TypeScript将能够足够地跟踪并根据其为您键入返回值。

或者,不使用reduce,只需对result进行类型标注:

let result: Record<string, string> = {};
for (const val of generateTimeIntervals(0, 1440, 30)) {
    result[val] = val;
}

15

@AlexeySh。generateTimeIntervals没有在任何地方定义,当然它不会编译。 - caseyjhol
2
谢谢,这似乎是最符合惯用语的答案。 - leo
1
将类型传递给 reduce 函数 array.reduce<T>(...) 就足够了,因为其余的类型推断都能完美地工作。即使像第一个答案一样对 initialValue 进行了类型标注,TS 仍然会将累加器的类型推断为数组类型,直到我这样做。非常感谢! - mix3d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接