【问题标题】:Typescript interface conformance with firestore queriesTypescript 接口与 Firestore 查询的一致性
【发布时间】:2019-01-07 10:13:38
【问题描述】:

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

或者有更好的解决方案吗?

【问题讨论】:

    标签: typescript firebase google-cloud-firestore


    【解决方案1】:

    鉴于doc.data() always returnsDocumentData,其中is just {[field: string]: any},我认为没有比强制转换更好的方法可以将其转换为Payment。你可以写:

    const data = doc.data();
    const payment = {amount: doc.amount, /*and so on for the remaining members*/};
    

    没有演员表,但我认为这在实际方面并不更好。 DocumentData 只是 any 对我来说更有意义(例如 JSON.parse 的返回);您可以提交问题on the project 来提出建议。

    【讨论】:

      【解决方案2】:

      不确定这是否有帮助,但我认为这是您程序中的类型和您从 Firestore 发送和接收的类型是不同的类型。

      因此,打字稿具有这种“部分”功能,它采用接口并使所有字段都成为可选的。这样即使对象不完整,它仍然会符合并为您提供智能感知。

      所以,我这样做: export type dataUpdate&lt;T&gt; = Partial&lt;T&gt;;

      然后,我这样做: const userPayload: dataUpdate&lt;User&gt; = snapshot/typecase as User

      【讨论】:

        【解决方案3】:

        我用的是const payment = doc.data() as Payment;,不知道支持哪个版本的打字稿。

        【讨论】:

          【解决方案4】:

          您的解决方案只是对doc.data() 进行类型转换。那是 不是解决方案,它是一种解决方法。因为,这样做你可能会面临 运行时错误。

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

          const payment = doc.data()

          如果是const,将自动强制输入。

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

          【讨论】:

          • 我已经更新了我的示例来说明我为什么要强制输入。
          • @dwjohnston 即使您通过类型转换强制键入,amount 属性也不存在并且您的函数doSomethingWithPayment 将无法打印amount 的值。
          • @dwjohnston。您可以编写一个将DocumentData 类型转换为Payment 类型的函数。通过添加缺少的参数。
          【解决方案5】:

          至少从 Javascript SDK 版本 8(v9 处于公开测试阶段)开始,Firestore 现在有一个 FirestoreDataConverter interface 来指定添加或检索文档数据时的类型:

          这允许在执行Query 时使用withConverter() method,以确保将文档数据建模到对象/类/接口上并满足其类型要求。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-11
            • 2012-03-26
            • 2020-11-22
            • 1970-01-01
            • 2017-08-11
            • 1970-01-01
            • 2019-04-25
            • 1970-01-01
            相关资源
            最近更新 更多