【问题标题】:How to use FieldValue.serverTimestamp in application models如何在应用程序模型中使用 FieldValue.serverTimestamp
【发布时间】:2018-03-06 18:09:36
【问题描述】:

在我的 Typescript 应用程序代码中,我定义了一个模型,该模型使用 Firestore 在服务器上生成的时间戳。当文档从数据库返回时,该字段将是一个 ISO 字符串。我想在整个应用程序中使用相同的模型定义来写入和读取数据,但这会带来问题。

我通常会这样写:

interface Document {
  title: string,
  createdAt: string
}

async function addDocument(document: Document): Promise<string> {
  const id = await firestore.collection('documents').add(someDocument)
  return id
}

async function getDocumentData(documentId: string): Promise<Document> {
  const doc = await firestore.collection('documents').doc(documentId).get()

  invariant(doc.exists, `No document available with id ${documentId}`)
  return doc.data() as Document
}

const someDocument: Document = {
  title: "How to",
  createdAt: firestore.FieldValue.serverTimestamp()
}

const newDocumentId = await addDocument(someDocument)

现在 Typescript 编译器抱怨 someDocument 的值不兼容,因为 createdAt 被定义为字符串。

之前,我通过欺骗编译器相信它是带有createdAt: firestore.FieldValue.serverTimestamp() as string 的字符串来解决这个问题。

随着最近对 Typescript 的更新,这种容忍度似乎随着我使用的严格设置而消失了。编译器现在告诉我:

“FieldValue”类型无法转换为“字符串”类型。

我想知道处理这个问题的正确方法是什么?

-- 编辑--

由于 Firestore 时间戳行为即将发生变化,我再次查看此内容,我发现 API 实际上并未返回 ISO 字符串,而是返回 Date 对象。因为 Date 对象具有自动字符串转换,所以我的代码总是可以工作,但是从这个意义上说,类型定义是不正确的。不过,这对我最初的问题并没有太大变化。

【问题讨论】:

    标签: typescript firebase google-cloud-firestore


    【解决方案1】:

    Firebase 的新行为是从 db 方法返回 Timestamp 对象,而不是 Date 对象。

    在我的类型定义文件中,我现在导入 Timestamp 类型(为此需要 Typescript 2.9),然后在我的模型中使用它,如下所示:

    export type FirestoreTimestamp = import("firebase").firestore.Timestamp;
    
    export interface LockableItem {
      isLocked: boolean;
      lockedBy?: UserId;
      lockedAt?: FirestoreTimestamp;
    }
    

    当使用 FieldValue 设置 lockedAt 字段时,您现在可以简单地执行以下操作:

    const item: LockableItem = { 
      isLocked: true,
      lockedAt: FieldValue.serverTimestamp() as FirestoreTimestamp, 
      lockedBy: "someuser" 
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 2018-04-12
      • 1970-01-01
      • 2022-06-10
      • 2021-05-09
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2016-08-21
      相关资源
      最近更新 更多