[英]Angular Best Practice on creating Generic method
我正在使用 HttpClient 在 Angular 中設計 Api 端點。 這是一個單一的服務 class ,它將處理所有 Rest 調用,它將從其他服務類調用(當前正在進行 Rest 調用)。
制作通用 Rest 方法的最佳實踐是什么。
getApi(url: string, options?: object): Observable<any> {
return this.http.get<any>(url, options).pipe(
catchError((error: HttpErrorResponse) => {
return throwError(error);
})
)
}
或者
getApi<T>(url: string, options?: object): Observable<T> {
return this.http.get<T>(url, options).pipe(
catchError((error: HttpErrorResponse) => {
return throwError(error);
})
)
}
上述任何一個都能夠處理:HttpEvent、HttpResponse 或其他此類響應嗎?
我應該采取多種方法來處理嗎?
請注意,答案非常基於意見。
在我展示我的解決方案之前,我想分享它下面的想法。 因此,當我使用 TS 時,我希望擁有盡可能嚴格的類型。 因此,在這種情況下,使用any
、 object
或類似的東西會分散注意力。 我還想避免任何額外的類型轉換,因為它會在某處導致錯誤。
幸運的是,TS 非常聰明地幫助我實現了這個目標,因為它可以根據使用情況識別類型。
基於此,我們可以構建如下內容:
一個非常通用的 class 可以滿足我們的一切需求(它可以通過傳遞參數來擴展,以獲取、記錄、計數器任何你需要的東西)
class HttpService {
get<TData, TResult>(url: string, data?: TData): Promise<TResult> {
return fetch(url, data)
.then(x => x.json())
.catch((err) => console.log(err));
}
}
但是這個 class 不應該直接使用。 我建議創建一個更嚴格和更專業的服務,該服務將隔離獲取邏輯並提供嚴格的類型,而不是 generics。
type User = {
name: string;
}
class MyDataService {
constructor(private readonly _transportService: HttpService) { }
fetchUserInfo(userId: number): Promise<User> {
return this._transportService.get('/some/url', userId);
}
}
現在,我可以使用 MyDataService 而無需任何類型轉換和類型猜測。 另一個好處是這項服務非常容易測試,因為您可以根據需要替換傳輸模塊。
希望我的回答對你有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.