#angular #typescript #rxjs #rxjs6
#angular #typescript #rxjs #rxjs6
Вопрос:
Я хочу сопоставить ошибку HttpClient с ее типом, и у меня есть этот код:
export class ErrorMessageInterceptor implements HttpInterceptor {
constructor(private notifyService: NotifyService) {}
public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(
catchError(error => {
console.error(error);
return throwError({
ok: error.ok,
status: error.status,
statusText: error.statusText,
code: error.error.error.code,
message: error.error.error.message,
headers: error.headers,
url: error.url,
} as OdataError);
}),
tap(() => {}, async error => {
await this.notifyService.error(error.message);
}),
);
}
}
Но, к сожалению, тип по умолчанию для error
tap
оператора in остается any
, и я бы не хотел сопоставлять тип ошибки везде, где он будет использоваться. Итак, у меня здесь 2 вопроса:
- Почему ошибка отображенного типа не видна в приведенном выше коде?
- Есть ли способ установить пользовательский тип ошибки глобально или, по крайней мере, для экземпляра injected
HttpClient
?
Комментарии:
1. Что касается 1. Параметр
error
обратного вызова всегда определяется какany
. Он не вводится какnext
обратный вызов. Смотрите: github.com/ReactiveX/rxjs/blob/master/src/internal/operators /…2. Спасибо, что нашел это, @fridoo. Я предполагаю, что это также отвечает на мой второй вопрос о том, что такое сопоставление пока невозможно. По крайней мере, не без разветвления RxJS…
3. «(ошибка: HttpErrorResponse)» — это просто сработало бы. для «сообщения» — вам нужно будет создать какой-то mapper (потому что это не то же самое с начальным HttpErrorResponse); angular.io/api/common/http/HttpErrorResponse
4. обновление: в «tap» — «async (ошибка: OdataError)» должно работать
5. Конечно, это будет работать для одной функции, но то, что я здесь делаю, — это поиск способа сделать это глобально