firebase.firestore.FieldValue.serverTimestamp() 不支持 Timestamp 数据类型

Sam*_*ath 2 firebase typescript angular google-cloud-firestore

 async createUser(uid: string, email: string) {
    await this.afs.doc<UserProfileModel>(FirestoreDbConstant.USER_PROFILES + `/${uid}`).set({
      email,
      createdDate: firebase.firestore.FieldValue.serverTimestamp(),
    });
  }
Run Code Online (Sandbox Code Playgroud)

这个模型有效

export interface UserProfileModel {
    email: string;
    createdDate?: firebase.firestore.FieldValue;
}
Run Code Online (Sandbox Code Playgroud)

但是为什么我不能Timestamp像这样在这里使用?

import { Timestamp } from '@firebase/firestore-types';

export interface UserProfileModel {
    email: string;
    createdDate?: Timestamp;
}
Run Code Online (Sandbox Code Playgroud)

然后它给出了这个错误:

(property) UserProfileModel.createdDate?: Timestamp Type 'FieldValue' 缺少来自类型 'Timestamp' 的以下属性:seconds, nanoseconds, toDate, toMillists(2739) user-profile.model.ts(11, 5): 预期的类型来自属性“createdDate”,它在“UserProfileModel”类型上声明

这里的问题是我需要toDate()在模板上使用。但它不适用于 createdDate?: firebase.firestore.FieldValue;

<p>{{invitedEvent.startDatetime.toDate() | amDateFormat: 'MMM DD'}}</p>
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 5

正如您从serverTimestamp()JavaScript API 文档中看到的

serverTimestamp(): 字段值

返回与 set() 或 update() 一起使用的标记,以在写入的数据中包含服务器生成的时间戳。

返回字段值

它不返回时间戳类型。它返回一个 FieldValue,它的值实际上只是一个特殊值的占位符,它告诉服务器生成时间戳。客户端根本不生成这个时间戳,因为我们不能信任客户端设备的时钟。

这意味着您不能真正使用相同的模型来读取和写入使用服务器时间戳的记录。在进入的路上,它将是一个 FieldValue。在出路时(当您查询文档时),它将是一个时间戳。


小智 5

这可能比“任何”或重复模型更好:

lastModified: Timestamp | FieldValue;