2016-08-19 9 views
0

Сегодня я столкнулся со следующей проблемой при попытке реализовать абстрактный HTTP-сервис. Эта услуга должна основываться на всех других сервисах http.RxJS наблюдаемые и общие типы для Angular2 (Typcript) http wrapper

Реализация следит за до сих пор, пропуская другие методы Ilustration:

@Injectable() 
export abstract class HttpWrapper<T> { 

    private options: RequestOptions; 

    constructor(private http: Http, private endpointUrl: string) { 
    let headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    this.options = new RequestOptions({ headers: headers }); 
    } 

    public getAll(): Observable<T[]>{ 
    return this.http.get(this.endpointUrl, this.options) 
     .map(this.extractAll) 
     .catch(this.handleError); 
    } 

    abstract handleError(error: any):Observable<Response>; 

    abstract extractOne(res: Response):T; 

    abstract extractAll(res: Response):T[]; 
} 

Теперь, если я хочу использовать аннотацию HttpWrapper я сделать следующее:

@Injectable() 
export class BlastReportService extends HttpWrapper<Item> { 

    constructor(http: Http) { 
    super(http,'/api/items'); 
    } 


    handleError(error: any):Observable<Response>{ 
    //Handling error 
    return Observable.throw(error); 
    } 

    extractAll(res: Response):Item[]{ 
    let body = res.json(); 

    let formatedBody = body.map((item: Item) => { 
     item = new Item(item); 
     return blastReport; 
    }); 

    return formatedBody || [{}]; 
    } 
} 

Но при этом я получаю следующая погрешность компиляции:

Type 'Observable<Response>' is not assignable to type 'Observable<T[]>'. 
    Type 'Response' is not assignable to type 'T[]'. 
    Property 'find' is missing in type 'Response'. 

Я не могу обмотать голову вокруг этого, потому что метод extractAll явно возвращает Item [] и используется при сопоставлении результатов, возвращаемых с сервера.

Я решил реализовать этот абстрактный HttpWrapper «оставаться сухим». Я не уверен, что это лучший способ сделать это.

+0

extractAll возвращает позицию [], но ваш класс должен быть HttpWrapper . Поэтому он должен вернуть BlastReport []. Также неясно, откуда это сообщение об ошибке. Пожалуйста, сообщите полную и точную ошибку. –

+0

Кроме того, ваш метод должен возвращать Observable , но handleError возвращает Observable . –

+0

Прошу прощения за этот взрыв, который не должен быть в вопросе. Редактирование. –

ответ

1

Похоже, проблема здесь заключается в том, что handleError() возвращает Observable<Reponse>, и, следовательно, не может быть возвращаемым значением getAll(), которое ожидает Observable<T[]>

Изменения типа возвращаемого HandleError в Observable<T[]> должны решить проблему.

В HttpWrapper

abstract handleError(error: any):Observable<T[]> 

BlastReportService В

handleError(error: any): Observable<T[]> { 
    return Observable.throw(error) 
} 
+0

Привет, Филипп Плантье, проблема была в действии в возвращаемом значении handleError. Большое спасибо. –

+0

Честно говоря, я немного стыжусь задавать такой глупый вопрос. –

Смежные вопросы