angularfire2 @ 5 AngularFireDatabase.object ('path-to-item'). valueChanges () возвращает Observable <{}> вместо Observable <any>? - PullRequest
0 голосов
/ 07 января 2019

Я только начал работать с 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 возвращает обещание Observable {}.
Так почему же AngularFireDatabase.object ('...'). ValueChanges () не возвращает обещание Observable типа any , как это должно быть? И как я могу назначить интерфейс типа для объектов, возвращаемых из AngularFireDatabase.object ('...'). ValueChanges ()?

1 Ответ

0 голосов
/ 07 января 2019

установить официальную библиотеку Firebase для угловых

npm установка firebase @ angular / fire --save

рефакторинг вашего getOrCreateCartId метода для возврата наблюдаемого вместо обещания

и затем используйте это

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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...