在类型上找不到带有“字符串”类型参数的索引签名

Posted

技术标签:

【中文标题】在类型上找不到带有“字符串”类型参数的索引签名【英文标题】:No index signature with a parameter of type 'string' was found on type 【发布时间】:2020-01-06 06:22:30 【问题描述】:

我来自移动应用程序开发,对打字稿没有太多经验。如何声明 [string:any] 形式的地图对象?

错误出现在以下行:map[key] = value;

元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引“对象”类型。

在'Object'.ts(7053)类型上没有找到带有'string'类型参数的索引签名

 var docRef = db.collection("accidentDetails").doc(documentId);


 docRef.get().then(function(doc: any) 
   if (doc.exists) 
      console.log("Document data:", doc.data());
      var map = new Object();
      for (let [key, value] of Object.entries(doc.data())) 
        map[key] = value;

       // console.log(`$key: $value`);
      
   else 
      // doc.data() will be undefined in this case
      console.log("No such document!");
   ).catch(function(error: any) 
      console.log("Error getting document:", error);
  );

【问题讨论】:

【参考方案1】:

你需要声明一个记录类型

var map: Record<string, any> = ;

https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeystype

【讨论】:

【参考方案2】:

正如上面提到的@Tim Perry,直接使用对象。我的建议是建立自己的字典。

declare global 
   type Dictionary<T> =  [key: string]: T ;

然后你就可以使用了

const map: Dictionary<number> =  // if you want to store number.... 

哪个更容易阅读。

【讨论】:

【参考方案3】:

您通常不想使用new Object()。相反,像这样定义map

var map:  [key: string]: any  = ; // A map of string -> anything you like

如果可以的话,最好用更具体的东西替换any,但这应该可以开始。

【讨论】:

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

类型“HTMLFormControlsCollection”没有属性“x”并且没有字符串索引签名

TS基础

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

打字稿:类型“”没有索引签名

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

空对象的索引签名和记录之间的区别?