在“”类型上找不到带有“数字”类型参数的索引签名 - 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 编译器错误的主要内容,如果未能解决你的问题,请参考以下文章
在“nsstring *”类型的对象上找不到读取字典元素的预期方法
在以下类型的对象上找不到参数 [com.android.tools.build:gradle:3.3.0] 的方法 classpath():