typescript - Argument av typen 'DocumentData | undefined' kan inte tilldelas parametern av typen 'DocumentData'


Först vill jag säga att mycket av min kod förmodligen är hemsk, så jag ber om ursäkt. Min erfarenhet av .ts och .js är inte på en nivå där jag känner mig riktigt bekväm (därav att jag inte kan lösa detta). Så jag försöker få dokumentinnehåll från ett dokument till ett annat. För närvarande gör jag det via snapshots, även om jag är säker på att det finns snabbare och bättre sätt. Min kod finns nedan.

Felet uppstår när jag försöker ställa in det andra samlingens (redacted2) dokument till snapshot-data. Som du kan se från konsolloggarna vet jag att snapshot.data() har den värdefulla informationen jag behöver formaterad exakt på det sätt jag vill ha den. Jag antar att detta är liknande att ha ett guard-uttryck i Swift där jag kan kontrollera värdet för null och tilldela det till en given typ (men jag kan ha fel här).

                db.collection("Redacted").doc(context.params.sensors).get()
                .then(function(querySnapshot){
                    console.log("Query Snapshot is is isssss: ", querySnapshot)
                    console.log("Query Snapshot querySnapshot.data: ", querySnapshot.data)
                    console.log("Query Snapshot querySnapshot.data(): ", querySnapshot.data())
                    console.log("Query Snapshot querySnapshot.ref: ", querySnapshot.ref)
                    console.log("Query Snapshot querySnapshot.get: ", querySnapshot.get)

                    return querySnapshot
                }).then(function(querySnapshotData) {
                    console.log("ayoooooo blooooddd", querySnapshotData)
                    db.collection("Redacted2").doc(context.params.sensors).set(querySnapshotData.data())
                        .then((alertResponse1: any) => {
                            console.log("Successfully updated firestore: ", alertResponse1)
                        })
                        .catch ((alertError1: any) => {
                            console.log("Successfully updated firestore but with error: ", alertError1)
                        })
                })
                .catch(function(error) {
                    console.log("query snapshot error: ", error)
                });

Svar #1

Som du kan se från API-dokumentationen för DocumentSnapshot.data(), deklareras data() att returnera antingen DocumentData eller undefined. Det kan vara undefined om dokumentet inte existerade. TypeScript tillåter inte att du anropar metoder på något som möjligtvis kan vara undefined, eftersom det skulle generera ett fel vid körning. Du måste försäkra TypeScript om att resultatet faktiskt är ett DocumentData och aldrig undefined.

const data = snapshot.data()
if (data) {
    // data will never be undefined here, because we just checked that.
    const foo = data.foo
}