首页 > 解决方案 > 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”进行管理的最佳方法是什么?

标签: angulartypescriptdategoogle-cloud-firestoreinterface

解决方案


至少有两种方法可以管理它。由于寻求意见的问题对于 Stack Overflow 来说是题外话,您可以自己决定哪一个最适合您的情况。

您可以有两种不同的专辑界面,一种用于阅读,一种用于书写。写入的可以使用 FieldValue 类型,读取的可以使用 Timestamp 类型。

你也可以使用TypeScript 的联合类型来表示 Album_date 可以是 FieldValue 或 Timestamp。

album_date: firebase.firestore.FieldValue | firebase.firestore.Timestamp

这应该允许您按照您认为合适的方式投射单个字段。


推荐阅读