我正在以這種方式進行基本的 Firebase 呼叫以檢索集合
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;
Firebase 回傳的回應物件非常大,所以我在這部分將我需要的所有內容映射到一個新物件中:
const docs: Invoice[] = snapshot.docs.map((doc) => ({
...doc.data(),
}));
console.log(docs);
我在瀏覽器中得到結果:

但是 TypeScript 抱怨說:
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.
如果我做對了,它會說我的變數是一個具有單個屬性的物件陣列,該屬性是一個字串并且可以是任何東西?我怎樣才能讓它知道物件的真實樣子?
uj5u.com熱心網友回復:
doc.data()回傳的型別是{ [x: string]: any; },表示具有任意數字的物件或帶有字串作為鍵的屬性,每個屬性都可以有任何值。typescript 沒有辦法找出比這更具體的型別,因為資料庫幾乎可以回傳任何東西。
因此,由于打字稿無法確定型別,您需要斷言型別是什么:
const docs: Invoice[] = snapshot.docs.map((doc) => ({
...doc.data() as Invoice,
}));
注意:通過使用型別斷言,您是在告訴 typescript 不要檢查您的作業,而只是信任您。如果您犯了一個錯誤并且資料庫實際上包含不同型別的物件,那么打字稿將無法告訴您這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/412219.html
標籤:
上一篇:獲取并顯示用戶串列
