打字稿代码给出错误
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()) {
}
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)
答案 0 :(得分:1)
您不能仅将get()
的结果强制转换为Map。如果您有一个DocumentSnapshot对象,并且该文档包含一个对象类型字段,它将在快照中显示为普通的旧JavaScript对象。
答案 1 :(得分:1)
这似乎是对TypeScript的type assertions的误解。请注意,我们不是将它们称为“类型转换”,因为它不是众所周知的类型转换。
您在这里应该知道的要点是,类型断言被编译为空。在TypeScript playground中检查您的代码-很明显,它不是MCVE,它会引发很多编译错误,但足以看到右边没有Map
的概念屏幕的一部分。因此,您获得了纯对象,尝试将其用作Map
,显然,这是一个错误。
断言用于什么类型?如果您抢先知道在运行时,则使用它们的类型将不同于在编译时声明的类型。在这种情况下,如果您确实收到了Map
的{{1}},但是TypeScript坚持了使用纯对象的可能性,您可以说“以currentDoc.get
对待,我知道在做”。当然,在这种情况下,所有验证都取决于您自己。
现在,在这里做什么?我不了解Firebase API,因此无法提出任何具体建议,但是大致的指导如下:
1)只需使用普通的旧JavaScript对象即可。您有Object.keys(),for..of loop,依此类推。
2)将该对象显式转换为Map
。最简单的方法(尽管需要ES2017支持)是以下一种形式:Map