【问题标题】:Element implicitly has an 'any' type because index expression is not of type 'number'.ts(7015)元素隐式具有“任何”类型,因为索引表达式不是“数字”类型。ts(7015)
【发布时间】:2021-08-01 04:36:19
【问题描述】:

Typescript 新手在这里。我在 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 },[])

【问题讨论】:

    标签: javascript arrays typescript reduce


    【解决方案1】:

    根据您的代码,order 似乎是某个对象,其属性 updated_at 似乎是一个数字。在循环中,您将此数字格式化为字符串,并使用它来索引对象dates,以便最终得到日期到该日期订单的映射。

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

    假设你的order对象的类型是一个叫Order的接口,类似于:

    interface Order {
      updated_at: number;
      /* ... other props ... */
    }
    

    您需要将dates 设为Record<string, Order[]>(带有string 键的映射,其中包含Order 对象数组)。要将此类型应用于dates,您可以将其分配给reduce() 的第二个参数,如下所示:

    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
    

    【讨论】:

      【解决方案2】:

      由于它无法推断date 类型,它假定它是任何类型。

      您还尝试通过索引date 访问数组,因此它应该是 number 类型,因此它可以通过索引访问。

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

      由于我不知道您的确切用例,因此您可以如何判断变量是从字符串到数字的字典

      dates: { [key: string]: number }
      

      【讨论】:

      • 嘿@Freshta 我认为您可以参考 sam 的回答,因为您不存储数字,而是将订单数组作为键存储,所以它比我的更符合上下文。您的日期将是 { [key: string]: [] } 类型
      猜你喜欢
      • 2023-02-15
      • 2022-06-12
      • 2023-04-01
      • 2022-01-22
      • 2018-04-25
      • 2021-10-11
      • 2017-03-14
      • 2016-07-23
      • 1970-01-01
      相关资源
      最近更新 更多