angular - 打字稿类型转换可观察变量
问题描述
我正在使用 Angular 12。
为了减少相同服务逻辑的代码,我一次又一次地尝试创建一个包含所有 HTTP 方法的基类,并扩展子类以在组件中使用。
crud.service.ts
@Injectable({
providedIn: "root"
})
export class CrudService {
protected endpoint: string;
protected listObservableType: any;
constructor(
private http: AppHttpClient
) {
}
list(query: {[key: string]: any}): Observable<any> {
const url = `${this.endpoint}`;
let param = ''
for (let key in query) {
param += `${key}=${query[key]}&`
}
return this.http.Get(`${url}?${param}`);
}
}
要使用基类,子类可以写成
@Injectable({
providedIn: "root"
})
export class CategoryService extends CrudService {
endpoint = 'category/';
}
子类中的设置endpoint
将覆盖父类,并且将自动提供所有重复的 CRUD 操作。
到目前为止,这工作正常,但方法的返回类型list()
是Observable<any>
.
我想使用listObservableType
可以分配接口的变量动态设置返回类型
export class CategoryService {
listObservableType = Array<CategoryItem>;
}
那么返回类型可以写成
list(): Observable<this.listObservableType> {
...
}
我不确定它应该如何,但上述逻辑不起作用。
Stackblitz:https ://stackblitz.com/edit/angular-dynamic-observable?file=src%2Fapp%2Fservices%2Fcrud.service.ts
编辑 2:接口
每个子服务都有如下接口
分页列表页面
export interface CategoryListResponse {
count: number;
next: string;
previous: string;
results: Array<CategoryItem>;
}
export interface CategoryItem {
id: number;
title: string;
}
该list()
方法将返回 observable ofCategoryListResponse
而get()
,create()
端点将返回 observable of CategoryItem
。
解决方案
使用参数化泛型:
export class CrudService<T> {
list(): Observable<T[]> {
...
}
getById(id: string): Observable<T>{...}
}
export class CategoryService extends CrudService<CategoryItem>
推荐阅读
- java - 代号一个多列表图像 - 新的 gui 构建器
- command - 使用“win_command:mklink softlinkfile destfile”时找不到mklink.exe\”
- javascript - 开玩笑:从测试中返回一个值
- reactjs - Flow Typed - 高阶组件 - 道具注入
- circular-dependency - 由于转发功能,与Dependency walker的循环依赖?
- android - 完成()后活动屏幕仍然存在
- php - WordPress AJAX 函数返回中的 Echo 短代码
- ios - 音频套件 - 不同 DB 级别的调频音调?
- c# - nhibernate 和 fluent nhibernate 的内存泄漏
- php - PHP - 亵渎过滤器不起作用