2016-08-19 3 views
0

오늘 추상 HTTP 서비스를 구현하는 동안 다음과 같은 문제가 발생했습니다. 이 서비스는 다른 모든 http 서비스를 위해 확장되어야합니다.Angular2 (Typescript)의 RxJS observables 및 generic 형식 http 래퍼

@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 || [{}]; 
    } 
} 

하지만 얻을이 일을 : 이제 나는 다음을 수행 추상적 HttpWrapper을 사용하려는 경우

@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[]; 
} 

:

구현은 ilustration입니다 다른 방법을 건너 뛰고, 지금까지 다음입니다 다음 컴파일 오류 :

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를 "DRY 상태로 유지"하기로 결정했습니다. 그렇게하는 것이 가장 좋은 방법인지 확실하지 않습니다. 그것은 여기 문제처럼 보인다

+0

extractAll에서 HttpWrapper

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

에서

은 [] 항목을 반환하지만 클래스는 HttpWrapper 될 예정이다. 따라서 BlastReport []를 반환해야합니다. 이 오류 메시지의 출처도 분명하지 않습니다. 완전하고 정확한 오류를 게시하십시오. –

+0

또한 메서드는 Observable 을 반환하지만 handleError는 Observable 을 반환합니다. –

+0

그 blastReport에 대해 유감스럽게 생각하지 않아도됩니다. 편집 중. –

답변

1

handleError()이 문제를 해결해야 Observable<T[]>로는 handleError의 반환 형식을 변경하는 Observable<T[]>

을 기대 getAll()의 반환 값이 될 수 없습니다 따라서 Observable<Reponse>을 반환하고 있다는 것입니다. BlastReportService

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

안녕하세요, Philippe Plantier, 문제는 handleError 반환 값에서 발생했습니다. 고맙습니다. –

+0

솔직히 나는 그런 어리석은 질문을 게시하는 것이 부끄럽다. –

관련 문제