angular - Wrappa HttpClient-tjänsten samtidigt som typningen behålls
Jag försöker skapa en wrapper för HttpClient-tjänsten för att göra några personaliseringar. Jag vill inte kapsla in någon logik i interceptorer, det jag letar efter är att kapsla in den tjänsten utan att förlora alla typer.
detta är omslaget:
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
@Injectable()
export class RestApiService {
constructor(private http: HttpClient) {}
get<T>(url: string, options?) {
return this.http.get<T>(url, options);
}
}
detta är implementeringen:
import { Injectable } from '@angular/core';
import { EndpointService } from '../endpoint.service';
import { HttpParams } from '@angular/common/http';
import { RestApiService } from '../rest-api.service';
type Product = {
id: string;
name: string;
};
@Injectable()
export class ProductService {
constructor(private restApi: RestApiService, private endPoint: EndpointService) {}
getThings(sku) {
const params = new HttpParams()
.set('ref', sku);
return this.restApi.get<Product>(this.endPoint.ratings, {params: params});
}
}
Sedan i min komponent:
ngOnInit() {
this.productService.getThings(this.sku).subscribe(data => {
data
});
}
På detta sätt är data ett ArrayBuffer eftersom TypeScript verkar hänvisa till denna signatur av HttpClient:
get(url: string, options: {
headers?: HttpHeaders;
observe?: 'body';
params?: HttpParams;
reportProgress?: boolean;
responseType: 'arraybuffer';
withCredentials?: boolean;
}): Observable<ArrayBuffer>;
Men bör peka på denna signatur:
get<T>(url: string, options: {
headers?: HttpHeaders;
observe?: 'body';
params?: HttpParams;
reportProgress?: boolean;
responseType?: 'json';
withCredentials?: boolean;
}): Observable<T>;
Hur kan jag peka på rätt signatur? Om jag också anger olika alternativ, bör jag peka på rätt signatur, så om jag anger som alternativ responseType: 'text' bör jag peka på rätt signatur:
get(url: string, options: {
headers?: HttpHeaders;
observe?: 'body';
params?: HttpParams;
reportProgress?: boolean;
responseType: 'text';
withCredentials?: boolean;
}): Observable<string>;
Hur kan jag lösa detta?