Javascript 元素隐式具有“any”类型,因为索引表达式不是“number”类型。ts(7015)

Javascript 元素隐式具有“any”类型,因为索引表达式不是“number”类型。ts(7015),javascript,arrays,typescript,reduce,Javascript,Arrays,Typescript,Reduce,这里是打字新手。我在reduce数组方法中的“date”下得到上述错误。我知道我需要将日期声明为数字而不是字符串,但不确定如何/在何处 提前谢谢 const dates = log?.reduce((dates, order) => { const date = dateFormat(order.updated_at); if (!dates[date]) { dates[date] = []; } dates[date].push(order); return dates },[])

这里是打字新手。我在reduce数组方法中的“date”下得到上述错误。我知道我需要将日期声明为数字而不是字符串,但不确定如何/在何处

提前谢谢

const dates = log?.reduce((dates, order) => {
const date = dateFormat(order.updated_at);
if (!dates[date]) {
  dates[date] = [];
}
dates[date].push(order);
return dates },[])
由于它不能推断日期类型,所以它假定它是任何类型的

您还试图按索引日期访问数组,因此该数组应为number类型,以便可以按索引访问

您可以告诉它日期是一个整数,但由于这可能不是您的用例,您可以告诉它日期是一个字典

因为我不知道您的确切用例,所以这里是如何从字符串到数字区分变量的

dates: { [key: string]: number }
根据您的代码,order似乎是某个对象,其属性更新了_,似乎是一个数字。在循环中,您将该数字格式化为字符串,并使用它来索引对象日期,以便最终将日期映射到该日期的订单

在Typescript中,映射/字典正式称为记录,通常作为记录写入,以表示TypeOfKey到TypeOfValue的映射。在较旧的代码中,您可能会遇到定义类似{[key:TypeOfKey]:TypeOfValue}的记录的旧但仍然有效的方法。最基本的记录是记录,只要属性是字符串,就可以将任何数据放在该记录上

假设order对象的类型是名为order的接口,类似于:

interface Order {
  updated_at: number;
  /* ... other props ... */
}
您需要将日期作为一个记录,并使用包含Order对象数组的字符串键映射。要将此类型应用于日期,请将其指定给reduce like so的第二个参数:


嘿@Freshta我想你可以参考sam的答案,它比我的答案更具上下文意义,因为你不存储数字,而是将订单数组存储为一个键。您的日期类型为{[key:string]:[]}谢谢您的帮助!:谢谢你,山姆!这是有道理的:
const dates = log?.reduce((dates, order) => {
  const date = dateFormat(order.updated_at);
  if (!dates[date]) {
    dates[date] = [];
  }
  dates[date].push(order);
  return dates;
}, {} as Record<string, Order[]>); // <-- gives "dates" this type