[英]Angular Service - Type of object returned is object and not that of the generic type specified
我有一個angular5服務,該服務執行HTTP獲取並返回特定類型,如下所示
public getProductByIDproductId: string): Observable<Product> {
const headers = new HttpHeaders({ "Content-Type": "application/json" });
const url = `${environment.productservice_baseurl}/${productId}`;
return this.http
.get<Product>(url, { headers: headers })
.pipe(
tap(data => (this._product = data)),
catchError(this.handleError)
);
}
產品類是具有屬性和方法的類。 下面是一個小摘錄。
class Product{
productID:string;
productName:string;
setQuantity(quantity:number){
}
}
當我在get返回的this._product上調用setQuantity函數時,出現“ setQuantity不是函數”錯誤。 當我嘗試檢查this._product的實例時,它不是Product類型,而是Object類型。
在get方法上設置的泛型類型是否僅用於幫助進行編譯時類型檢查? 如何從getProductByIDproductId方法獲取產品類的具體實例?
你不能做你正在做的事。
從URL提取數據時,您只會得到JSON。 您是在告訴TypeScript data
是Product
類型的,但這只是對編譯器的提示,並不使它正確。
data
不是通過調用new Product
創建的,因此不會共享其方法。
如果希望this._product
的行為類似於本機Product
實例,則可以執行以下操作:
this._product = data;
Object.setPrototypeOf(this._product, Product.prototype);
這樣,您可以將this._product
轉換為實際的Product
實例,包括其方法。
如果您擔心setPrototypeOf
及其潛在的性能缺陷,那么另一個選擇是這樣做:
this._product = new Product();
Object.assign(this._product, data);
當然,如果Product
具有無參數構造函數,這只是一個好主意。 而且,無論如何,如果data
具有未在Product
類中定義的屬性,則還可能會遇到性能問題。
您可以例如映射響應。
return this.http
.get<Product>(url, { headers: headers })
.map(response => new Product(response)) // I don't know your constructor
.pipe(
tap(data => (this._product = data)),
catchError(this.handleError)
);
這樣,您可以確保您的對象將是您定義的Typescript對象。
編輯您只需幾行即可“手動”創建對象:
export class Product {
// Your class ...
public static createProductFromHttpResponse = (response: any) => {
const ret = new Product();
for (let key in response.key) { ret[key] = response[key]; }
return ret;
}
}
在您的映射中:
.map(response => Product.createProductFromHttpResponse(response))
據我所知,要指定響應類型,應該使用接口而不是類,因此您的產品應該是接口:
interface Product{
productID:string;
productName:string;
}
而且因為它只是接口和http響應,所以它不應具有任何方法
編輯
@trichetriche的答案可能是此問題的解決方案之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.