Typescript接口与Firestore查询的一致性

时间:2018-07-31 05:50:39

标签: typescript firebase google-cloud-firestore

如何使用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();

还是有更好的解决方案?

5 个答案:

答案 0 :(得分:1)

  

您拥有的解决方案只是强制转换doc.data()。那是   不是解决方案,而是一种解决方法。因为这样做,您可能会面对   运行时错误。

所以,我的建议是,只需使用:

const payment = doc.data()

对于const,将自动强制键入。

OR

  

您可以编写将DocumentData类型转换为   Payment类型。通过添加缺少的参数。

答案 1 :(得分:1)

鉴于doc.data() always returnsis 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,以确保将文档数据建模到对象/类/接口上并满足其类型要求。