Как манипулировать данными Firebase для назначения моей модели?

1
**Model:**

export interface User {
    $key?: string;
    firstname: string;
    lastname: string;
    id: number;
    age: number;
}

**Angular service:**

public fetchAvailableUsers(): void {
      this.firebaseSubscriptions.push(this.db.collection('users')
         .snapshotChanges()
         .pipe(
            map(docArray => {
                  return docArray.map(
                    return {
                        $key: doc.payload.doc.id,
                        ...doc.payload.doc.data()
                    };
                });
            })
         )
         .subscribe((users: User[]) => {
            this.store.dispatch(new fromUser.SetUsers(users));
         }, error => {
         ...
      }));
   }

**Error:**

Argument of type '(users: User[]) => void' is not assignable to parameter of type '(value: { $key: string; }[]) => void'.
Types of parameters 'users' and 'value' are incompatible.
Type '{ $key: string; }[]' is not assignable to type 'User[]'.
Type '{ $key: string; }' is not assignable to type 'User'.
Property 'firstname' is missing in type '{ $key: string; }'.

Я пробовал так много способов часами, чтобы обойти это, но я продолжаю получать эту ошибку. Я не могу получить возвращаемый тип данных из наблюдаемой базы данных, чтобы соответствовать моей модели. Как это исправить?

  • 0
    Я думаю, что вы неправильно связываете Observables. Попробуйте следовать синтаксису канала, то есть pipe(observable1Function(), observable2Function()).subscribe(...);
Теги:
angular
firebase
rxjs
angularfire2

1 ответ

0
Лучший ответ

Задайте тип коллекции.

this.db.collection<User>('users')

Если это не сработает, определите возвращаемый объект как User вместо общего объекта.

let user: User = {
  $key: doc.payload.doc.id,
  ...doc.payload.doc.data()
};
return user;
  • 0
    Это действительно сработало. Все, что было нужно, - это общий тип в коллекции. Большое спасибо! @ Жозеф-Webber

Ещё вопросы

Сообщество Overcoder
Наверх
Меню