firebase - TypeScript nu este conștient de tipul unui obiect destructurat
Fac un apel de bază Firebase pentru a prelua o colecție în acest mod
import { getFirestore, collection, getDocs } from "firebase/firestore";
import { Invoice } from "../models/Invoice";
const db = getFirestore();
export const getInvoicesCollection = async () => {
try {
const snapshot = await getDocs(collection(db, "invoices"));
const docs: Invoice[] = snapshot.docs.map((doc) => ({
...doc.data(),
}));
console.log(docs);
} catch (error) {
console.error(error);
}
};
export default getInvoicesCollection;
Obiectul de răspuns returnat de Firebase este destul de mare, așa că mapez tot ce am nevoie într-unul nou în această parte:
const docs: Invoice[] = snapshot.docs.map((doc) => ({
...doc.data(),
}));
console.log(docs);
Și obțin rezultatul în browser:
Dar TypeScript se plânge că:
Type '{ [x: string]: any; }[]' is not assignable to type 'Invoice[]'.
Type '{ [x: string]: any; }' is missing the following properties from type 'Invoice': id, createdAt, paymentDue, description, and 8 more.
Dacă am înțeles corect, spune că variabila mea este un șir de obiecte cu o singură proprietate care este un șir de caractere și poate fi orice? Cum pot să fac să fie conștientă de cum arată cu adevărat obiectul?
Răspuns #1
Tipul pe care doc.data() îl returnează este { [x: string]: any; }, ceea ce înseamnă un obiect cu un număr arbitrar de proprietăți, fiecare având ca și cheie un șir de caractere, iar valoarea fiecăreia poate fi orice. Nu există niciun mod prin care TypeScript să determine un tip mai specific decât acesta, deoarece baza de date ar putea returna practic orice.
Deci, deoarece TypeScript nu poate determina tipul, va trebui să afirmi care este tipul:
const docs: Invoice[] = snapshot.docs.map((doc) => ({
...doc.data() as Invoice,
}));
Notă: prin utilizarea unei afirmații de tip, îi spui TypeScript să nu-ți verifice munca și să aibă încredere în tine. Dacă faci o greșeală și baza de date conține de fapt tipuri diferite de obiecte, TypeScript nu va putea să-ți spună despre asta.
