Я пытаюсь сопоставить обещания angularfire2 с типизированными наблюдаемыми. Это мой класс:
export class RestService<T extends Entity> {
constructor(
protected afAuth: AngularFireAuth,
protected store: AngularFirestore,
protected readonly collectionName: string) {
this.collection = store.collection<T>(collectionName);
}
protected collection: AngularFirestoreCollection<any>;
all(): Observable<Array<T>> {
return from(this.collection
.snapshotChanges()
.pipe(
map(action => mapActionArray(action)),
catchError((error: any) => {
throw new ApiError(error);
})
)
);
}
}
/**
* Override Firestore errors with common app errors.
* @param error - Firestore error
*/
function mapError(error: any): Observable<ApiError> {
return throwError(new ApiError(error));
}
function mapDocument<T extends Entity>(doc: DocumentSnapshot<any>): T {
return {
id: doc.id,
...doc.data()
};
}
Обратите внимание на метод all (), я хочу отобразить любую ошибку в catchError, но дело в том, что я получаю ошибку такого типа:
TS2322: Type 'Observable<{}[]>' is not assignable to type 'Observable'. Type '{}[]' is not assignable to type 'T[]'. Type '{}' is not assignable to type 'T'.
Я исправил это, изменив тип возвращаемого значения на Observable <{} | Array>, но для этого потребовалось бы использовать одни и те же типы всякий раз, когда я использую эту службу, мне это не подходит. Как мне обойти это? Я хочу иметь возможность вводить свои службы и заранее отображать ошибки в соответствующий объект CustomError (включая отображение кодов в сообщениях).
Кстати, я также пробовал использовать throwError из RXJS.
Заранее спасибо.
Отвечая на свой вопрос, мне пришлось использовать catchError перед оператором карты. Так:
all(): Observable<Array<T>> {
return from(this.collection
.snapshotChanges()
.pipe(
map(action => mapActionArray(action)),
catchError((error: any) => {
throw new ApiError(error);
})
)
);
}
Станет
all(): Observable<Array<T>> {
return from(this.collection
.snapshotChanges()
.pipe(
catchError((error: any) => {
throw new ApiError(error);
}),
map(action => mapActionArray(action))
)
);
}
Надеюсь, поможет