Повторение карты Typescript дает ошибку map.keys не является функцией в облачной функции - PullRequest
0 голосов
/ 04 марта 2019

машинописный код в облачной функции firebase дает ошибку

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)

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Это неправильное понимание утверждений типа TypeScript .Обратите внимание, что мы не называем их «приведением типов», поскольку это не приведение типов в общеизвестном смысле.

Главное, что вы должны знать здесь, это то, что утверждения типа скомпилированы в ничто.Проверьте ваш код на TypeScript игровой площадке - очевидно, он генерирует много ошибок компиляции, поскольку это не MCVE , но достаточно хорошо, чтобы понять, что понятия Map нетв правой части экрана.Итак, вы получаете чистый объект, пытаетесь использовать его как Map, и, очевидно, это ошибка.

Для чего используются утверждения типа?Они используются, если вы заранее знаете, что во время выполнения тип будет отличаться от того, который объявлен во время компиляции.В этом случае, если вы действительно получили Map от currentDoc.get, но TypeScript настаивал на возможности использования простого объекта, вы можете просто сказать «трактуйте это как Map, я знаю, что я делаю».Конечно, в этом случае все проверки ложатся на вас самих.

Теперь, что здесь делать?Я не знаю API Firebase, поэтому не могу дать какой-либо конкретный совет, но общее направление может быть следующим:

1) Просто используйте обычный старый объект JavaScript.У вас есть Object.keys () , for..of loop и т. Д.

2) Явно преобразуйте этот объект в Map.Простейшим способом (хотя и требуется поддержка ES2017) является следующий однострочный: const variations = new Map(Object.entries(currentDoc.get('variation')));

0 голосов
/ 04 марта 2019

Вы не можете просто привести результат get() к карте.Если у вас есть объект DocumentSnapshot, а документ содержит поле типа объекта, он будет отображаться в снимке как обычный старый объект JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...