網站搜尋

angular - 在 Typescript 中擴展基類與注入它


我正在開發一個 Angular 4 應用程式,遇到一個情況,我有一個 htpInterceptor 基本服務類,它有 TypeScript 泛型的 GET、POST 和 DELETE 函數。我希望我所有的 Angular 服務都使用這個基類。現在我不確定我應該將這個基服務注入到我所有的服務中,還是應該讓所有的服務類繼承這個基服務類。

我應該使用 export class AuthService extends HttpInterceptorService 還是 constructor(private _interceptor:HttpInterceptorService) { }

這兩種方法之間的差異(優缺點)是什麼。

以下是我的基礎服務類別,

@Injectable()
export class HttpInterceptorService {

    constructor(private _http: Http) { }

    get<T>(relativeUrl: ApiUrl): Observable<T> {
        const baseUrl = environment.apiBaseUrl + environment.apiLearnerUrl;
        let apiUrl = baseUrl + relativeUrl.toString();
        return this._http.get(apiUrl).map(res => <T>res.json());
    }
    post<T>(relativeUrl: ApiUrl, inputData: any): Observable<T> {
        const baseUrl = environment.apiBaseUrl + environment.apiLearnerUrl;
        let apiUrl = baseUrl + relativeUrl.toString();
        if (inputData === undefined) {
            return this._http.post(apiUrl, undefined).map(res => <T>res.json());
        }
        else {
            return this._http.post(apiUrl, inputData).map(res => <T>res.json());
        }

    }

    delete<T>(relativeUrl: string): Observable<T> {
        const baseUrl = environment.apiBaseUrl + environment.apiLearnerUrl;
        let apiUrl = baseUrl + relativeUrl;
        return this._http.delete(apiUrl).map(res => <T>res.json());
    }
}

答案#1

利弊取決於具體情況。但上面的代碼是經典的組合與繼承困境。而通常推薦的方法是優先使用組合而非繼承。

在這種情況下,HttpInterceptorService 預期作為 Http 的擴展替代方案來運作。因此它應該被 注入,而不是 Http。

如果 AuthService 應該實現 HttpInterceptorService 並擴展其功能(例如:包裝現有方法並添加認證標頭),它應該從 HttpInterceptorService 繼承。

答案#2

使用匯入的服務時,你依賴 Angular 的依賴注入(DI),並決定在哪個層級包含它。

使用 extends 依賴原生 ES6 語法,因此它可能更具可移植性。

所以我想這主要是偏好問題,以及你是否認為你可能會在 Angular 之外使用你的程式碼。

另外,在使用 extends 時,你必須在每個調用父類的構造函數中調用 super()。如果你在意這點,這感覺不像 Angular 的方式…