angularfire2 @ 5的AngularFireDatabase.object('path-to-item')。valueChanges()返回Observable <{}>而不是Observable <any>?

时间:2019-01-07 09:07:28

标签: angular firebase firebase-realtime-database

我刚开始使用angularfire2版本5,试图将接口分配给从AngularFireDatabase.object方法返回的对象,但是在类型检查时遇到错误:类型'Observable <{}>'不能分配给类型'Observable'

该项目是使用Angular 7生成的。

import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
import { Injectable } from '@angular/core';
import { ShoppingCart } from './models/shopping-cart';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ShoppingCartService {

  constructor(private db: AngularFireDatabase) { 

  }

  async getCart(): Promise<Observable<ShoppingCart>> {
    let cartId = await this.getOrCreateCartId();
    return this.db.object('/shopping-carts/' + cartId).valueChanges();
  }
}

如果我不注释getCart方法,则错误消失,在这种情况下,显示getCart方法返回{}的Promise Observable。
那么,为什么AngularFireDatabase.object('...')。valueChanges()不像应有的那样返回 any 类型的promise Observable?以及如何为AngularFireDatabase.object('...')。valueChanges()返回的对象分配类型接口?

1 个答案:

答案 0 :(得分:0)

安装用于角度的官方Firebase库

npm install firebase @ angular / fire --save

重构您的getOrCreateCartId方法以返回可观察值而不是promise

然后使用它

getCart(): Observable<ShoppingCart> { return this.getOrCreateCartId() .pipe( switchMap((cartId: string) => { const cart = this.db.doc<ShoppingCart>('shopping-carts/' + cartId); return cart.valueChanges(); }) ) }

否则,如果您仍然希望返回

async getCart(): Observable<ShoppingCart> {
       const cardId = await this.getOrCreateCartId();
       const cart = this.db.doc<ShoppingCart>('shopping-carts/' + cartId);
       return cart.valueChanges().toPromise();
}

但请注意,自从您 toPromise 被使用以来,您就会

通知,您可以使用 from()

将任何类型的数据转换为可观察的数据