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?

Relaterade artiklar