Typescript映射迭代给出错误映射。keys不是云函数中的函数

Typescript映射迭代给出错误映射。keys不是云函数中的函数,typescript,firebase,google-cloud-firestore,google-cloud-functions,Typescript,Firebase,Google Cloud Firestore,Google Cloud Functions,firebase cloud函数中的typescript代码出现错误 TypeError: variations.keys is not a function 代码段导致下面给出的错误 const currentDoc = await transaction.get(ref) if (currentDoc !== undefined) { const variations = currentDoc.get('variation') as Map<string,any

firebase cloud函数中的typescript代码出现错误

TypeError: variations.keys is not a function
代码段导致下面给出的错误

 const currentDoc = await transaction.get(ref)
 if (currentDoc !== undefined) {        
 const variations = currentDoc.get('variation') as Map<string,any>
 for (const i of variations.keys()) {
 }
const currentDoc=wait transaction.get(ref)
如果(currentDoc!==未定义){
const variations=currentDoc.get('variations')作为映射
for(const i of variations.keys()){
}
firebase控制台显示此错误

TypeError: variations.keys is not a function
at Object.<anonymous> (/user_code/lib/index.js:54:52)
at next (native)
at fulfilled (/user_code/lib/index.js:4:58)
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
TypeError:variations.keys不是函数
at对象。(/user_code/lib/index.js:54:52)
在下一个(本地)
完成时(/user\u code/lib/index.js:4:58)
在进程中。_tickDomainCallback(internal/process/next_tick.js:135:7)

您不能将
get()
的结果强制转换为一个映射。如果您有一个DocumentSnapshot对象,并且该文档包含一个object type字段,它将在快照中显示为一个普通的旧JavaScript对象。

您不能强制转换
get()的结果
映射。如果您有一个DocumentSnapshot对象,并且该文档包含一个object type字段,它将在快照中显示为一个普通的旧JavaScript对象。

这似乎是对TypeScript的误解。请注意,我们不称它们为“类型转换”,因为它不是众所周知的类型转换

这里您应该知道的主要一点是类型断言被编译为空。请检查您的代码-它会抛出许多编译错误,显然,因为它不是一个,但它足够好,可以看到屏幕右侧没有
Map
的概念。因此,如果您得到纯对象,请尝试将其用作
Map
,显然,这是一个错误

类型断言用于什么?如果您预先知道在运行时该类型将不同于在编译时声明的类型,则使用它们。在这种情况下,如果您确实从
currentDoc.get
收到了
Map
,但TypeScript坚持使用纯对象的可能性,您可以说“将此视为
Map
,我知道我在做什么”。当然,在这种情况下,所有验证都取决于您自己

现在,该怎么办?我不知道Firebase API,所以我不能给出任何具体的建议,但大致的方向可能是:

1) 只需使用普通的老JavaScript对象即可。您有,等等


2) 显式地将此对象转换为
Map
。最简单的方法(尽管需要ES2017支持)是以下一行:
const variations=newmap(object.entries(currentDoc.get('variation'));

这似乎是对TypeScript的误解。请注意,我们没有将它们称为“类型转换”“,因为它不是众所周知的类型转换

这里您应该知道的主要一点是类型断言被编译为空。请检查您的代码-它会抛出许多编译错误,显然,因为它不是一个,但它足够好,可以看到屏幕右侧没有
Map
的概念。因此,如果您得到纯对象,请尝试将其用作
Map
,显然,这是一个错误

类型断言用于什么?如果您预先知道在运行时该类型将不同于在编译时声明的类型,则使用它们。在这种情况下,如果您确实从
currentDoc.get
收到了
Map
,但TypeScript坚持使用纯对象的可能性,您可以说“将此视为
Map
,我知道我在做什么”。当然,在这种情况下,所有验证都取决于您自己

现在,该怎么办?我不知道Firebase API,所以我不能给出任何具体的建议,但大致的方向可能是:

1) 只需使用普通的老JavaScript对象即可。您有,等等


2) 将此对象显式转换为
Map
。最简单的方法(尽管需要ES2017支持)是以下一行:
const variations=newmap(object.entries(currentDoc.get('variation'));

CurrentDoc是一个文档快照。我正在使用async和await。CurrentDoc由一个名为variation的嵌套对象组成。它的字段名是动态的。因此,我尝试将variation对象强制转换为map,并使用map.keys()对于字段名。但它给出了错误类型错误:variations.keys不是一个函数,您仍然不能将其转换为映射。如果您手头有一个快照,并且该快照在对象字段上,它将只是一个常规javascript对象,其属性与对象字段的属性匹配。CurrentDoc是一个文档快照。我使用的是async和await.currentdoc由一个名为variation的嵌套对象组成。它的字段名是动态的。因此,我尝试将variation对象强制转换为map,并使用map.keys()对于字段名。但它给出了错误类型错误:variations.keys不是一个函数,您仍然不能将其转换为映射。如果您手头有一个快照,并且该快照在对象字段上有,那么它将只是一个常规javascript对象,其属性与对象字段的属性匹配。