Как я могу решить ошибку 'TS2532: объект, возможно,' неопределен '? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь перестроить пример веб-приложения, использующего облачные функции Firebase и Firestore.При развертывании функции я получаю следующую ошибку:

src/index.ts:45:18 - error TS2532: Object is possibly 'undefined'.
45     const data = change.after.data();

Это функция:

export const archiveChat = functions.firestore
  .document("chats/{chatId}")
  .onUpdate(change => {
    const data = change.after.data();

    const maxLen = 100;
    const msgLen = data.messages.length;
    const charLen = JSON.stringify(data).length;

    const batch = db.batch();

    if (charLen >= 10000 || msgLen >= maxLen) {

      // Always delete at least 1 message
      const deleteCount = msgLen - maxLen <= 0 ? 1 : msgLen - maxLen
      data.messages.splice(0, deleteCount);

      const ref = db.collection("chats").doc(change.after.id);

      batch.set(ref, data, { merge: true });

      return batch.commit();
    } else {
      return null;
    }
  });

Я просто пытаюсь развернуть функцию для ее тестирования.И уже искал в интернете похожие проблемы, но не смог найти других постов, соответствующих моей проблеме.

1 Ответ

0 голосов
/ 26 февраля 2019

Машинопись говорит, что или change или data возможно undefined (в зависимости от того, что возвращает onUpdate).

Так что вы должны обернуть его в нулевую / неопределенную проверку

if(change && change.after && change.after.data){
    const data = change.after.data();

    const maxLen = 100;
    const msgLen = data.messages.length;
    const charLen = JSON.stringify(data).length;

    const batch = db.batch();

    if (charLen >= 10000 || msgLen >= maxLen) {

      // Always delete at least 1 message
      const deleteCount = msgLen - maxLen <= 0 ? 1 : msgLen - maxLen
      data.messages.splice(0, deleteCount);

      const ref = db.collection("chats").doc(change.after.id);

      batch.set(ref, data, { merge: true });

      return batch.commit();
    } else {
      return null;
    }
}

Если вы на 100% уверены, что ваш object всегда определен, вы можете указать это:

const data = change.after!.data();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...