【问题标题】:Typescript map iteration gives error map.keys is not a function in cloud function打字稿地图迭代给出错误map.keys不是云函数中的函数
【发布时间】:2019-03-04 19:02:18
【问题描述】:

firebase 云函数中的打字稿代码出错

TypeError: variations.keys is not a function

代码 sn-p 导致下面给出的错误

 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)

【问题讨论】:

    标签: typescript firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

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

    你应该知道的要点是类型断言被编译为空。检查TypeScript playground 中的代码 - 很明显,它会引发很多编译错误,因为它不是MCVE,但看到屏幕右侧没有Map 的概念就足够了。所以,你得到一个纯对象,尝试将它用作Map,很明显,这是一个错误。

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

    现在,在这里做什么?我不知道 Firebase API,所以我无法提出任何具体建议,但大致方向可能如下:

    1) 只需使用普通的旧 JavaScript 对象。你有Object.keys()for..of loop等等。

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

    【讨论】:

      【解决方案2】:

      您不能只将get() 的结果转换为地图。如果您有一个 DocumentSnapshot 对象,并且该文档包含一个对象类型字段,它将在快照中显示为一个普通的旧 JavaScript 对象。

      【讨论】:

      • currrentDoc 是文档快照。我正在使用异步和等待。 currentDoc 包含一个名为variation 的嵌套对象。它的字段名称是动态的。所以我试图将变体对象转换为映射并使用 map.keys() 作为字段名称。但它给出了错误TypeError:variations.keys is not a function
      • 您仍然不能只投射到地图上。如果您手头有一个快照,并且该快照具有对象字段,那么它将只是一个常规 javascript 对象,其属性与对象字段的属性相匹配。
      猜你喜欢
      • 2019-01-05
      • 1970-01-01
      • 2019-08-09
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多