如何使用angularfire 7+(firebase 9)获取类型化对象

bqf10yzr  于 2022-11-17  发布在  Angular
关注(0)|答案(1)|浏览(97)

我最近开始使用“新的”模块化方法angular和angularfire。
我正试图从一个集合中检索一个文档。
目前我有这个:

constructor(private firestore: Firestore, private auth: Auth) {
    const userId = this.auth.currentUser?.uid;
    const docReference = doc(this.firestore, 'queues/' + userId);
    this.myQueue$ = docData(docReference);
  }

我的目标是让myQueue$像这样键入:

public readonly myQueue$: Observable<Queue | null>;

但我不太确定怎么做?
我试着做了以下几点:

const docReference = doc<Queue>(this.firestore, 'queues/' + userId);
this.myQueue$ = docData<Queue>(docReference);

但它不起作用,因为this.firestore不是CollectionReference<Queue>(这似乎很正常,因为它是整个firestore数据库)。
这个modular有点令人痛苦,大多数doc仍然引用“老”方法:https://github.com/angular/angularfire/tree/master/docs/firestore
那么,如何处理类型化对象呢?

a11xaf1n

a11xaf1n1#

最简单的解决方案就是像这样转换文档引用:

const docReference = doc(
  this.firestore,
  'queues/' + userId
) as DocumentReference<Queue>;
this.myQueue$ = docData(docReference);

或者,如果Queue不仅是一个接口,而且是一个类,那么可以使用data converter

const queueCollectionReference = collection(
  this.firestore,
  'queues/'
).withConverter({
  toFirestore(queue: WithFieldValue<Queue>): DocumentData {
    return {
      /*...*/
    };
  },
  fromFirestore(
    snapshot: QueryDocumentSnapshot,
    options: SnapshotOptions
  ): Queue {
    const data = snapshot.data(options)!;
    return new Queue(/*...*/);
  },
});
const docReference = doc(queueCollectionReference, userId);
this.myQueue$ = docData(docReference);

相关问题