【问题标题】:No index signature with a parameter of type 'number' was found on type '{}' - Typescript compiler error在“{}”类型上找不到带有“数字”类型参数的索引签名 - Typescript 编译器错误
【发布时间】:2023-04-10 14:15:01
【问题描述】:

我有一个具有嵌套对象值的对象,我想反转键值对。我的代码只在普通的 javascript 中工作,但在 Typescript 中出现编译错误。

这是错误:

元素隐式具有“any”类型,因为“number”类型的表达式不能用于索引类型“{}”。 在“{}”类型上找不到带有“数字”类型参数的索引签名。

请指教。

Typescriplt playground link

预期输出:

{
  "5": "dataCut-1",
  "7": "dataCut-2",
  "8": "dataCut-3",
  "12": "dataCut-4",
  "15": "dataCut-5",
  "16": "dataCut-6",
  "undefined": "dataCut-7"
} 

【问题讨论】:

  • 您需要为初始对象指定一个显式类型,否则当用作累加器参数时,它会被推断为 {}。在这种情况下,Record<string, string> 看起来会起作用。例如:data.reduce((acc, [key, value]) => (acc[value.id!] = key, acc), {} as Record<string, string>).
  • 我鼓励你不要改变accumulator。如果您使用reduce,我假设您正在尝试以实用的方式制作它。考虑这个例子:{...acc, [id]: key }

标签: typescript object


【解决方案1】:

正如评论中所说,您需要注释更多。

我还想补充一点,您不应该使用! 来使类型检查静音。它警告您可能存在未定义的键,这是您明确定义的接口以允许并且实际存在于您的数据集中。

您的输出将包括undefined: 'dataCut-7'

下面的sn-p会丢弃没有和id的条目,当然你可以用任何你喜欢的方式处理它们,只要你处理它们。

Object.entries(data).reduce((acc:Record<string, string>, [key, value]) => {
    if(value.id) acc[value.id] = key;
    return acc
}, {});

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2019-11-18
    • 2021-06-27
    • 2019-10-27
    相关资源
    最近更新 更多