Сопоставить ошибку Angular HttpClient с ее типом

#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 вопроса:

  1. Почему ошибка отображенного типа не видна в приведенном выше коде?
  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. Конечно, это будет работать для одной функции, но то, что я здесь делаю, — это поиск способа сделать это глобально