Ошибка компиляции после обновления Angular и RxJS от 5 до 6 - PullRequest
0 голосов
/ 07 мая 2018

У меня проблема после обновления библиотек до новых Angular 6 и RxJS 6.

У меня есть RouteService класс, который работает как сервис. Он использует HttpClient для получения данных от удаленного API. После обновления я получаю странную ошибку при попытке скомпилировать проект.

Вот мой класс обслуживания:

import {Injectable} from '@angular/core';
import {HttpClient} from "@angular/common/http";
import {Observable} from "rxjs/Rx";
import {catchError} from 'rxjs/operators';

export interface Route {
    name:string;
    route_id:number;
    created_at:Date;
}

@Injectable()
export class RouteService {
    constructor(private http:HttpClient) {}

    getRoutesList():Observable<Route[]> {
        return this.http.get<Route[]>(`http://localhost:8090/api/routes`)
        .pipe(catchError(ServiceUtil.handleError));
    }
}

Вот метод handleError:

import {HttpErrorResponse} from '@angular/common/http';
import {ErrorObservable} from 'rxjs/observable/ErrorObservable';

export module ServiceUtil {
    export function handleError(error:HttpErrorResponse) {
        if (error.error instanceof ErrorEvent)
        console.error('An error occurred:', error.error.message);
        else 
        console.error('An error occurred:', JSON.stringify(error.error));    
        return new ErrorObservable(error.error);
    }
}

После ng serve Я получаю ошибку:

ERROR in src/app/service/route-service/route.service.ts(21,5): error TS2322: Type 'Observable<{} | Route[]>' is not assignable to type 'Observable<Route[]>'.
Type '{} | Route[]' is not assignable to type 'Route[]'.
    Type '{}' is not assignable to type 'Route[]'.
    Property 'includes' is missing in type '{}'.

Failed to compile.

Что я делаю не так? Что-то не так с моим кодом, который вызывает ошибку в новых версиях, но работает в старой? Или что-то изменилось?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Где-то пользователь getRoutesList не ожидается Route[].

getRoutesList(): Observable<any>

Или измените ошибку handlerError вернитесь к

return Observable.throw(error.error)
0 голосов
/ 12 мая 2018

Я использовал http-перехватчик как @ Riscie и он работает.

Вот часть моего кода:

export class AngularInterceptor implements HttpInterceptor {
    intercept(req:HttpRequest<any>, next:HttpHandler):Observable<HttpEvent<any>> {
        return <any>next.handle(req)
        .pipe(timeout(5000), tap(event => {}, error => {
            if(error == null)
                throw {"message": "Unknown server error", "code": 987};
            else if(error.error != null) {
                if(error.error.code != null)
                    throw error.error;
                else if(error.status != null)
                    throw "message": error.error.error, "code": error.status};          
            }
            else
                throw {"message": error+"", "code": 986}
        }));
    }
}

Правильно ли сейчас?

0 голосов
/ 07 мая 2018

Как говорит ошибка.

Измените объявление метода на:

getRoutesList():Observable<Route[] | {}>
...