【问题标题】:Index type error when transforming object转换对象时出现索引类型错误
【发布时间】:2021-03-17 06:37:01
【问题描述】:

我正在尝试转换一个对象,该对象将数组作为值,将数字作为键,并将值更改为数组的长度。

但是我收到一个类型错误,提示“元素隐式具有任何类型,因为字符串类型的元素不能用于索引 {}” 我不清楚为什么它坚持 key 是一个字符串类型,而它是一个数字。

代码是:

  const agentOccupancy = Object.entries(agentOccupiedServicesAndQueues).reduce(
        (obj, [key, value]) => {
          obj[key] = value.length;
          return obj;
        },
        {},
      );

【问题讨论】:

  • Object.entriesObject.keys 总是返回 string
  • 但是on type '{}' 指的是您在reduce 中创建为{} 的变量obj,因此您需要为其分配一些类型才能设置任何属性。

标签: typescript


【解决方案1】:

Object.entriesObject.keys 总是 返回 string。您将获得对象数字键的 string 表示形式。

Object.keys(["a", "b", "c"]); // an array with number keys
--> ["0", "1", "2"] // console output is an array of strings

您错误的第二部分“不能用于索引类型'{}'”是指.reduce() 回调中的累加器类型。你从初始值 {} 开始,这就是 Typescript 所知道的一切,所以当你设置任何不在 {} 上的属性时它会报错。

我们需要为累加器分配一个类型来解决这个问题。我们将使用的类型是Record<string | number, number>,它表示任何stringnumber 都会返回一个值,并且该值始终是number

const agentOccupancy = Object.entries(agentOccupiedServicesAndQueues).reduce(
  (obj: Record<string | number, number>, [key, value]) => {
    obj[key] = value.length;
    return obj;
  },
  {}
);

agentOccupancy 对象实际上如下所示:{ "0": 1 }。但是您可以使用string 键(如"0")或number 键(如0)来访问该值。

console.log(agentOccupancy["0"]);
console.log(agentOccupancy[0]);

Typescript Playground Link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2021-03-09
    相关资源
    最近更新 更多