web-dev-qa-db-fra.com

Comment puis-je résoudre l'erreur «TS2532: l'objet est peut-être« non défini »?

J'essaie de reconstruire un exemple d'application Web qui utilise les fonctions Cloud Firebase et Firestore. Lors du déploiement d'une fonction, j'obtiens l'erreur suivante:

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

Voici la fonction:

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;
    }
  });

J'essaie simplement de déployer la fonction pour la tester. Et j'ai déjà recherché des problèmes similaires sur le Web, mais je n'ai trouvé aucun autre message correspondant à mon problème.

29
Constantin Beer

Depuis octobre 2019, le chaînage facultatif (le ? operator) est désormais disponible sur TypeScript 3.7 (Beta). Vous pouvez installer cette version en exécutant la commande suivante:

npm install TypeScript@beta

En tant que tel, vous pouvez simplifier votre expression comme suit:

const data = change?.after?.data();

Vous pouvez en savoir plus à ce sujet dans les notes de version , qui couvrent d'autres fonctionnalités intéressantes publiées sur cette version.

Mise à jour (à partir de novembre 2019)

Le chaînage optionnel de TypeScript est désormais officiellement disponible. L'installation de la dernière version de TypeScript devrait vous permettre d'accéder aux nouvelles fonctionnalités intéressantes.

npm install TypeScript

Cela étant dit, chaînage facultatif peut être utilisé avec coalescence nulle pour fournir une valeur de secours lors du traitement des valeurs null ou undefined

const data = change?.after?.data() ?? someOtherData();
15
wentjun

TypeScript dit que change ou data est probablement undefined (selon ce que onUpdate retourne).

Vous devez donc l'envelopper dans une vérification nulle/non définie:

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;
    }
}

Si vous êtes sûr à 100% que votre object est toujours défini, vous pouvez mettre ceci:

const data = change.after!.data();
42
distante