【问题标题】:Angular Best Practice on creating Generic method创建通用方法的 Angular 最佳实践
【发布时间】:2020-10-08 05:39:00
【问题描述】:

我正在使用 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或其他类似的响应吗?

我应该多方法处理吗?

【问题讨论】:

  • 你需要知道any和类型的区别。在这里查看答案stackoverflow.com/questions/44023061/…。就个人而言,我更喜欢使用 并避免使用多少。但是,在某些情况下,这是不可能的
  • 当你不能使用T时,只能使用any
  • 为什么你不直接使用 HttpClient ?
  • @bubbles 现在每个服务都在使用 HttpClient 调用 api,但我希望在其之上有一个包装器,以便所有 Rest 调用都可以从一个通用服务类完成。
  • @Ben 如果我们使用 来定义类型,我们可以传递 对吗? function identity(arg: T): T { return arg; } 常量 v: 任意 = 身份(988);所以我认为用通用 定义将是一个更好的选择!请让我知道你的想法我对角度和打字稿很陌生

标签: angular typescript rxjs


【解决方案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 而无需任何类型转换和类型猜测。另一个好处是这项服务非常容易测试,因为您可以随意替换传输模块。

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

【讨论】:

  • 如果某些函数期望 Observable> 作为响应,这会是一种有效的方法吗?我应该将上述情况作为 Observable> 处理吗?
  • 避免混用 observable 和 promise 方法是个好主意。如果您想使用 observable - 传输 (httpService) 应该返回 Observable 并且具体服务应该返回 Observable.
  • 实际上,运输服务返回的确切对象并不重要。将通用传输服务从具体实现中分离出来的主要思想
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2014-05-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 2012-03-29
相关资源
最近更新 更多