angular - Angular / Firebase / Typescript 接口 - 如何使用 toDate() 管理 firebase.firestore.FieldValue 的接口类型
问题描述
我有一个界面,其中日期设置为使用 Firestore 时间戳。
export interface Album{
album_name: string,
album_date: firebase.firestore.FieldValue;
}
如果我想添加一个新项目,这很好用
this.albumsCollection.add({
album_name: "My Album",
album_date: firebase.firestore.FieldValue.serverTimestamp(),
})
从 Firestore 获取专辑文件
但是,在从 firestore检索专辑文档album_date
时,如果我排除. 但是,我正在尝试使用toDate
它以使其出现在 Angular Material Date Picker
public getAlbum(): Observable<Album> {
this.itemDoc = this.afs.doc<Album>(`albums/1`);
return this.itemDoc.snapshotChanges()
.pipe(map(collectionDoc => {
const data = collectionDoc.payload.data();
return {
...data,
album_date: (data.album_date as firebase.firestore.Timestamp).toDate(),
} as Inspection;
}),
shareReplay()
);
}
在线收到的错误:album_date: (data.album_date as firebase.firestore.Timestamp).toDate(),
如下:
'{ album_Date: Date; 类型的转换 }' 来输入 'Album' 可能是一个错误,因为这两种类型都没有与另一种充分重叠。如果这是故意的,请先将表达式转换为“未知”。属性 'album'_date 的类型不兼容。“日期”类型中缺少属性“isEqual”,但在“字段值”类型中是必需的。
当接口也配置为 Firestore 时,在返回的 Firestore 时间戳上使用“toDate”进行管理的最佳方法是什么?
解决方案
至少有两种方法可以管理它。由于寻求意见的问题对于 Stack Overflow 来说是题外话,您可以自己决定哪一个最适合您的情况。
您可以有两种不同的专辑界面,一种用于阅读,一种用于书写。写入的可以使用 FieldValue 类型,读取的可以使用 Timestamp 类型。
你也可以使用TypeScript 的联合类型来表示 Album_date 可以是 FieldValue 或 Timestamp。
album_date: firebase.firestore.FieldValue | firebase.firestore.Timestamp
这应该允许您按照您认为合适的方式投射单个字段。
推荐阅读
- firebase - 如何在firebase中共享同一帐户的不同设备之间同步数据
- java - 用于检索项目的@GetMapping 给出了外键对象无限循环的响应
- python - NoneType' 对象不可下标
- pyspark - 如何在pyspark数据框中的一行中做regexp_replace?
- python-3.x - 从 python zipfile 中提取 zip 时出现密码错误
- python - 如何在 Python3 中从没有格式字符(反斜杠/撇号)的文本文件中导入行
- vue.js - Vue Js 安装
- c - 我不确定为什么我的 strncpy 函数中途中断?
- matlab - 我不明白使用 Matlab 的 dsolve 函数时遇到的错误
- python - 试图创造一个基因组群