Angular 创建泛型方法的最佳实践

Angular 创建泛型方法的最佳实践,angular,typescript,rxjs,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: HttpErr

我正在使用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(url:string,options?:object):可观察{
返回此.http.get(url,options).pipe(
catchError((错误:HttpErrorResponse)=>{
返回投掷器(错误);
})
)
}

getApi(url:string,options?:object):可观察{
返回此.http.get(url,options).pipe(
catchError((错误:HttpErrorResponse)=>{
返回投掷器(错误);
})
)
}
上面的任何一个是否能够处理:HttpEvent、HttpResponse或其他此类响应


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

请注意,答案是基于意见的。

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

幸运的是,TS非常聪明,可以帮助我实现这一目标,因为它可以根据使用情况识别类型

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

一个非常通用的类,可以满足我们所需的一切(可以通过传递参数来扩展它,以获取、记录、计数器您所需的一切)

class-HttpService{
获取(url:string,data?:TData):承诺{
返回获取(url、数据)
.然后(x=>x.json())
.catch((err)=>console.log(err));
}
}
但是这个类不应该直接使用。我建议创建一个更严格、更专业的服务,它将隔离获取逻辑,并提供严格的类型而不是泛型

类型用户={
名称:字符串;
}
类MyDataService{
构造函数(私有只读_transportService:HttpService){}
fetchUserInfo(userId:number):承诺{
返回此。_transportService.get('/some/url',userId);
}
}
现在,我可以使用MyDataService而无需任何类型转换和类型猜测。另一个好处是,该服务非常容易测试,因为您可以根据需要替换传输模块


希望我的回答能帮助您。

您需要知道任何类型和类型之间的区别。看看这里的答案。就我个人而言,我更喜欢使用和避免我能做多少。但是,在某些情况下,只有在不能使用
T
的情况下才使用
any
是不可能的。为什么不直接使用HttpClient呢?@bubbles现在每个服务都在使用HttpClient调用api,但我想在它上面加一个包装器,这样所有Rest调用都可以从一个通用服务类中完成。@Ben如果我们使用定义打字对吗?函数标识(arg:T):T{return arg;}const v:any=identity(988);因此,我认为使用泛型定义将是一个更好的选择!请让我知道你的想法,我对angular和TypeScription非常陌生,如果某个函数期望作为响应可以观察到,这是一种有效的方法吗?我是否应该将上述情况视为可观察的?避免将可观察和承诺方法混为一谈是一个好主意。如果您想使用observable-transport(httpService)应该返回observable,而具体的服务应该返回observable。实际上,由transport服务返回的确切对象并不重要。将通用传输服务从具体实现中分离出来的主要思想
getApi<T>(url: string, options?: object): Observable<T> {
    return this.http.get<T>(url, options).pipe(
      catchError((error: HttpErrorResponse) => {
        return throwError(error);
    })
  )
}