如何在 TypeScript 中添加索引签名

新手上路,请多包涵

我正在尝试将 reduce 与 Typescript 结合使用来达到传入消息的总数。我对如何添加索引签名感到困惑。我不断收到错误消息:“元素隐含地具有‘任意’类型,因为‘{}’类型没有索引签名。”在变量 newArray 和 counts[k] 上。我已经阅读了几个类似的问题,但还没有弄清楚如何将它们应用到我的特定场景中。我是 JavaScript 和 TypeScript 的新手。

这是我的数组:

         var data = [
        { time: '9:54' },
        { time: '9:54' },
        { time: '9:54' },
        { time: '9:55' },
        { time: '9:55' },
        { time: '9:55' },
        { time: '9:55' },
        { time: '9:56' },
        { time: '9:56' },
        { time: '9:56' },
        { time: '9:56' },
        { time: '9:57' },
        { time: '9:57' },
        { time: '9:57' },
        { time: '9:57' },
        { time: '9:57' }
    ];

这就是我需要我的数组在重新图表中使用的方式:

         var dataWithCounts = [
        { time: '9:54', messages: 3 },
        { time: '9:55', messages: 4 },
        { time: '9:56', messages: 4 },
        { time: '9:57', messages: 5 }
    ];

借助这个 Stack Overflow 问题的“只是一个学生”的回答: Group and count values in an array ,我有以下内容。

         var counts = data.reduce((newArray, item) => {
           let time = item.time;
           if (!newArray.hasOwnProperty(time)) {
               newArray[time] = 0;
           }
           newArray[time]++;
           return newArray;
        }, {});

        console.log(counts);

        var countsExtended = Object.keys(counts).map(k => {
           return { time: k, messages: counts[k] };
       });

       console.log(countsExtended);

我在哪里以及如何声明索引签名?以下是我尝试过的各种事情。

  • let newArray: { [time: string] }; 并收到重复标识符错误。

  • 将字符串添加到参数 var counts = data.reduce((newA:string, item) 给我一个错误“元素隐式具有‘任何’类型,因为索引表达式不是‘数字’类型。”

  • 添加 newA[time].toString() 给我错误,“赋值表达式的左侧必须是变量或属性访问。”

原文由 Bethany 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 332
2 个回答

.reduce 调用中的累加器类型几乎肯定是问题所在。因为它只是作为 {} 给出的,所以它的类型被推断为,并且类型 {} 没有索引签名。您可以通过转换初始值来解决此问题,使其包含签名:

 var counts = data.reduce((newArray, item) => {
    let time = item.time;
    if (!newArray.hasOwnProperty(time)) {
        newArray[time] = 0;
    }
    newArray[time]++;
    return newArray;
}, {} as {[key: string]: any}); // <-- note the cast here

我给出了索引签名类型 any ,但您可能希望针对您的特定情况使其更具体。

原文由 CRice 发布,翻译遵循 CC BY-SA 3.0 许可协议

数组的正确类型是:

 Array<{time: string}>

或者:

 {time: string}[]

或者:

 {[key: number]: {time: string}}

原文由 Jonas Wilms 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题