我正在尝试将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:类型'Observable <{} []>'不可分配为类型'Observable'。类型'{} []'不可分配给类型'T []'。不能将类型'{}'分配给类型'T'。
我通过将返回类型更改为Observable <{} |来修复它。 Array>,但是每当我使用此服务时,都需要使用相同的类型,但我觉得不好。 我该如何解决?我希望能够键入我的服务,并事先将错误映射到适当的CustomError对象(这包括将代码映射到消息)。
顺便说一句,我也尝试过使用RXJS的throwError。
谢谢。
答案 0 :(得分:0)
回答我自己的问题,我必须在map运算符之前使用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))
)
);
}
希望有帮助