TypeScript 3.1.6 Angular 7 Rxjs6 Использование catchError показывает ошибку в редакторе, но код работает правильно

Я пытаюсь вернуть настраиваемую ошибку из службы данных в случае ошибки и.

public getRoles(): Observable<Array<Role> | CustomError> {

    return this.http.get(this.urlService.getRoles)
        .pipe(
            map((res: any) => {
                    let roles = new Array<Role>();
                    res.Result.forEach(item => {
                        roles.push(new Role().fromItem(item));
                    });

                    return roles;
                }
            ),
            catchError(err => {
                let customError = new CustomError();
                customError.errorNumber = err.status;
                customError.message = err.message;
                return throwError(customError);
            })
        );
}

Приведенный выше код работает так, как я ожидал, но текстовый редактор указывает на следующую ошибку:

(TS) Тип Наблюдаемый ‹{} | Роль []> 'не может быть назначена типу' ObservableRole [] | CustomError> '.

Введите '{} | Роль [] »не может быть назначена типу« Роль [] | CustomError '.

Тип '{}' не может быть назначен типу 'Role [] | CustomError '.

Тип '{}' нельзя присвоить типу 'CustomError'.

Свойство errorNumber отсутствует в типе "{}"

Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы решить проблему?

Оказывается, это не единственное место в коде, где у меня возникает проблема с catchError. У меня есть простой перехватчик, который будет записывать HTTP-ошибки в консоль. (Экспериментировал, как использовать перехватчики).

public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log(`ErrorInterceptor - ${req.url}`);

    return next.handle(req)
        .pipe(catchError(err => {
            console.log(err);
            return throwError(err);
        }));
}

С этим блоком кода я получаю очень похожий набор сообщений. Правильно ли я использую catchError и throwError?


person GregP    schedule 05.12.2018    source источник
comment
Добро пожаловать в stackoverflow. Какой редактор вы используете? Что вам говорит консоль с ng serve? Ng serve --prod pass?   -  person Bartando    schedule 05.12.2018
comment
Я использую Visual Studio 2017. ng serve --prod действительно проходит   -  person GregP    schedule 05.12.2018
comment
Общий тип Observable - это тип событий, которые он генерирует. Ваши единственные испускают события типа Array ‹Role›. CustomError - это тип ошибки, а не тип события. Вы просто должны быть объявлены как Observable ‹Array ‹Role››. См. rxjs-dev.firebaseapp.com/api/index/function/throwError: его тип возврата - Observable ‹never›, потому что он никогда ничего не испускает.   -  person JB Nizet    schedule 06.12.2018
comment
@JBNizet Мне кажется, я понимаю, что вы говорите, но можете ли вы предложить, как исправить то, что я пытаюсь сделать?   -  person GregP    schedule 06.12.2018
comment
Ваш наблюдаемый объект должен быть просто объявлен как Observable ‹Array ‹Role››.   -  person JB Nizet    schedule 06.12.2018
comment
Я прочитал статью, в которой очень хорошо обсуждалась обработка ошибок и наблюдаемые здесь: блог .angular-university.io / rxjs-error-processing Однако даже после того, как я переписал свой код так, как описано в этой статье, я все равно получаю то, что выглядит как ошибки в текстовом редакторе. Код работает правильно.   -  person GregP    schedule 06.12.2018


Ответы (1)


Боже мой, вам нужно импортировать класс throwError? :

import {Observable, throwError} from 'rxjs';
person Олег Шевченко    schedule 07.03.2019