在“”类型上找不到带有“数字”类型参数的索引签名 - Typescript 编译器错误

Posted

技术标签:

【中文标题】在“”类型上找不到带有“数字”类型参数的索引签名 - Typescript 编译器错误【英文标题】:No index signature with a parameter of type 'number' was found on type '' - Typescript compiler error在“”类型上找不到带有“数字”类型参数的索引签名 - Typescript 编译器错误 【发布时间】:2021-07-16 21:23:08 【问题描述】:

我有一个具有嵌套对象值的对象,我想反转键值对。我的代码只在普通的 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 【参考方案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
, );

【讨论】:

以上是关于在“”类型上找不到带有“数字”类型参数的索引签名 - Typescript 编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

在带有 M1 芯片的 Xcode 12 上找不到类型“*”

查找累积和反应打字稿

在“nsstring *”类型的对象上找不到读取字典元素的预期方法

在以下类型的对象上找不到参数 [com.android.tools.build:gradle:3.3.0] 的方法 classpath():

TS基础

在 jsf 中的类型上找不到属性