如何使用Firebase和我自己的Typescript接口?
即。这里有一个函数,我需要完整的Payment
对象(而不仅仅是增量),因此我可以通过DocumentReference
对象来实现。
function doSomethingWithPayment(payment: Payment) {
console.log(payment.amount);
}
exports.resolveStripeCharge = functions.firestore.document('/payments/{paymentId}')
.onWrite((change : Change <DocumentSnapshot>) => {
change.after.ref.get().then((doc: DocumentSnapshot )=> {
const payment : Payment = doc.data(); // tslint warning here.
doSomethingWithPayment(payment);
})
[ts]
Type 'DocumentData' is not assignable to type 'Payment'.
Property 'amount' is missing in type 'DocumentData'.
const payment: Payment
我得到返回的对象不一定符合接口的要求-但无论如何-如果我想强制键入,我应该在这里做什么?
我只使用:
const payment : Payment = <Payment>doc.data();
还是有更好的解决方案?
答案 0 :(得分:1)
您拥有的解决方案只是强制转换
doc.data()
。那是 不是解决方案,而是一种解决方法。因为这样做,您可能会面对 运行时错误。
所以,我的建议是,只需使用:
const payment = doc.data()
对于const
,将自动强制键入。
OR
您可以编写将
DocumentData
类型转换为Payment
类型。通过添加缺少的参数。
答案 1 :(得分:1)
鉴于doc.data()
always returns是is just DocumentData
的{{1}},我认为没有更好的方法将其转化为{{ 1}}比强制转换。您可以这样写:
{[field: string]: any}
没有强制转换,但我认为从实用角度来看,这并不更好。对我来说,Payment
只是const data = doc.data();
const payment = {amount: doc.amount, /*and so on for the remaining members*/};
(例如返回DocumentData
来举一个例子)对我来说更有意义。您可以提出问题on the project提出该建议。
答案 2 :(得分:1)
我使用了 const payment = doc.data() as Payment;
我不知道这是支持哪个版本的打字稿。
答案 3 :(得分:0)
不确定这是否有帮助,但是我的想法是程序中的类型与从Firestore发送和接收的类型是不同的类型。
因此,打字稿具有此“部分”功能,该功能带有接口,并使所有字段都可选。这样,即使对象不完整,它仍然会合规并为您提供智能感知。
所以,我这样做:
export type dataUpdate<T> = Partial<T>;
然后,我这样做:
const userPayload: dataUpdate<User> = snapshot/typecase as User
答案 4 :(得分:0)
至少从 Javascript SDK 的第 8 版(v9 处于公开测试阶段)开始,Firestore 现在有一个 FirestoreDataConverter interface 用于在添加或检索文档数据时指定类型:
这允许在执行 withConverter() method 时使用 Query,以确保将文档数据建模到对象/类/接口上并满足其类型要求。