【发布时间】: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