簡體   English   中英

Angular 創建泛型方法的最佳實踐

[英]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 時,我希望擁有盡可能嚴格的類型 因此,在這種情況下,使用anyobject或類似的東西會分散注意力。 我還想避免任何額外的類型轉換,因為它會在某處導致錯誤。

幸運的是,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM