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.
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();
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();