오늘 추상 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 상태로 유지"하기로 결정했습니다. 그렇게하는 것이 가장 좋은 방법인지 확실하지 않습니다. 그것은 여기 문제처럼 보인다
extractAll에서
HttpWrapper
에서
은 [] 항목을 반환하지만 클래스는 HttpWrapper 될 예정이다. 따라서 BlastReport []를 반환해야합니다. 이 오류 메시지의 출처도 분명하지 않습니다. 완전하고 정확한 오류를 게시하십시오. –
또한 메서드는 Observable을 반환하지만 handleError는 Observable 을 반환합니다. –
그 blastReport에 대해 유감스럽게 생각하지 않아도됩니다. 편집 중. –