创建通用方法的Angular最佳实践

时间:2020-06-18 08:09:14

标签: angular typescript rxjs

我正在使用HttpClient在Angular中设计Api端点。这是一个单一的服务类,它将处理所有的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或其他类似的响应吗?

我应该使用多种方法来处理吗?

1 个答案:

答案 0 :(得分:1)

请注意,答案非常基于意见。

在我展示解决方案之前,我想分享它的思想。 因此,当我使用TS时,我希望具有尽可能严格的类型。因此,在这种情况下,使用anyobject或类似的东西会分散注意力。我也想避免任何额外的类型转换,因为这会导致某处错误。

幸运的是,TS非常聪明地可以帮助我实现此目标,因为它可以根据用途识别类型。

基于此,我们可以构建如下内容:

一个非常通用的类,可以满足我们的所有需求(可以通过传递参数进行扩展,以获取,记录和计数器所需的任何内容)

class HttpService {
    get<TData, TResult>(url: string, data?: TData): Promise<TResult> {
        return fetch(url, data)
            .then(x => x.json())
            .catch((err) => console.log(err));
    }
}

但是此类不应直接使用。我建议创建一个更严格和专门的服务,该服务将隔离提取逻辑并提供严格的类型而不是泛型。

type User = {
    name: string;
}

class MyDataService {

    constructor(private readonly _transportService: HttpService) { }
    fetchUserInfo(userId: number): Promise<User> {
        return this._transportService.get('/some/url', userId);
    }
}

现在,我可以使用MyDataService而不进行任何类型转换和类型猜测。另一个好处是,此服务非常易于测试,因为您可以根据需要替换传输模块。

希望我的回答对您有所帮助。

相关问题