我有一个类似的功能
async queryAll(): Promise<Product[]> {
const response = await this.firestore.collection('products').get();
return response.docs.map(a => a.data());
}
并出现错误:
类型'DocumentData []'无法分配给类型'Product []'。类型 'DocumentData'缺少以下类型的属性 '产品':id,名称
如何为该方法添加正确的返回类型?
在firebase/index.ts.d
,get
函数类型中可以看到什么(我正在使用npm firebase软件包):
get(options?: GetOptions): Promise<QuerySnapshot<T>>;
但不确定如何将其应用于我的代码。
答案 0 :(得分:1)
我已经找到解决方法,需要使用 withConverter,以便在从Firestore集合中检索数据时添加类型
添加了工作示例,来自result
函数的dbQuery
应该具有正确的类型,例如Product[]
import firebase from 'firebase';
import { firebaseConfig } from '../firebaseConfig';
export interface Product {
name: string;
}
export const productConverter = {
toFirestore(product: Product): firebase.firestore.DocumentData {
return { name: product.name };
},
fromFirestore(
snapshot: firebase.firestore.QueryDocumentSnapshot,
options: firebase.firestore.SnapshotOptions
): Product {
const data = snapshot.data(options)!;
return { name: data.name }
}
};
async function dbQuery() {
firebase.initializeApp(firebaseConfig);
const db = firebase.firestore();
const response = await db.collection("products").withConverter(productConverter).get();
const result = response.docs.map(doc => {
const data = doc.data();
return data;
});
return result; // result type is Product[]
}
答案 1 :(得分:0)
我发现使用TypeScript的Type assertions功能非常简单。
await db.collection('products').get() as firebase.firestore.QuerySnapshot<Product>;
对于单个文档:
await db.collection('products').doc('12345').get() as firebase.firestore.DocumentSnapshot<Product>;
在文档快照上调用data()
时,其类型将为Product
。