如何让通用服务的函数支持动态指定类型?
实现Angular通用HTTP服务的动态返回类型
我现在每个组件的服务逻辑基本一致,示例代码如下:
save(values: any): Observable<Register> { return this.httpClient.put<Register>(environment.apiBaseUrl + 'register', values); }
我想做一个能给所有组件用的通用服务,初步写了这样的代码:
save(values: any, path: string): Observable<Register> { return this.httpClient.put<Register>(environment.apiBaseUrl + path, values); }
调用时用this.myService.save(myObject, 'my-path'),但现在返回类型固定是Register,我需要根据场景指定成Login或者其他类型,怎么让这个函数支持动态指定类型?
解决方案:使用TypeScript泛型
直接给save方法定义泛型参数,就能实现动态指定返回类型,修改后的通用服务代码如下:
save<T>(values: any, path: string): Observable<T> { return this.httpClient.put<T>(environment.apiBaseUrl + path, values); }
调用示例:
- 指定返回为
Register类型
this.myService.save<Register>(registerData, 'register').subscribe(data => { // data 会被推断为 Register 类型 });
- 指定返回为
Login类型
this.myService.save<Login>(loginData, 'login').subscribe(data => { // data 会被推断为 Login 类型 });
- 利用TypeScript类型推断简化调用(如果传入的
values本身有明确类型)
// 假设 loginData 已经被定义为 Login 类型 this.myService.save(loginData, 'login').subscribe(data => { // data 会自动推断为 Login 类型 });
这样不管是哪种业务实体类型,都能通过泛型参数灵活指定,完美复用通用服务的逻辑。
内容的提问来源于stack exchange,提问作者xRay
相关产品推荐
相关产品推荐

