javascript - 将泛型类型作为类型参数传递
问题描述
我正在努力想出一个解决我面临的问题的方法,我试图将泛型类型用作类型参数。我有以下两个类/类型:
用户模型.ts:
export class UserModel{
private _id : string;
public get id() : string {
return this._id;
}
public set id(v : string) {
this._id = v;
}
....
}
HttpResponse.ts:
export class HttpResponse<T>{
private _success : boolean;
public get success() : boolean {
return this._success;
}
public set success(v : boolean) {
this._success = v;
}
private _model : T;
public get model() : T {
return this._model;
}
public set model(v : T) {
this._model = v;
}
}
你可以猜到,我使用它来拥有一个泛型类型来轻松处理 http 调用。预期用途是使用 HttpResponse 类型调用我的 http 方法,并且无论预期结果类型是什么类型参数。例如,当进行与用户相关的 http 调用时,类型参数将是HttpResponse<UserModel>>
,或者对于与资源相关的调用,它将是HttpResponse<ResourceModel>>
. 但是,我在尝试这个时似乎没有任何运气。
在我的数据服务中,我有一个发布到服务器的方法,称为“创建”和
create<T>(data: any){
//Angular's HttpClient
return this.http.post<T>(data, ...);
}
然后我有一个服务,它扩展了这个类,并在调用 super.create 之前用一些额外的位重载了 create 方法。我在这一点上遇到了这个问题,因为我想通过在HttpResponse<Type the service should return>
以下情况下将是HttpResponse<UserModel>
:
create<HttpResponse<UserModel>>(user: UserModel){
//stuff happens here
return super.create<HttpResponse<UserModel>>(user, ...);
}
但是,这会在 处返回语法错误create<HttpResponse<UserModel>>
。我在网上看了一下,发现了另一种方法来实现这一点,如下所示:
create<HttpResponse, UserModel>(user: any){
//stuff happens here
return super.create<HttpResponse<UserModel>>(user, ...);
}
但是,这再次返回一个错误,指出“HttpResponse 不是通用的”。
设计思路是通过这种方式传入类型,可以将来自服务端的json响应自动映射到合适的类型,使得响应在整个应用中的使用变得简单
关于我的设计哪里出错的任何指示?
解决方案
子类必须维护其基类的整个接口(有一些与此处无关的例外情况)。如果您的数据服务基类包含一个create
通用的方法并且适用于每个 T
,那么您的子类不能覆盖create
一个只适用于 的方法T = HttpResponse<UserModel>
。相反,请考虑 (1) 定义一个具有不同名称的新方法或 (2) 将T
参数从create
方法移动到基类本身,以便当您的子类扩展基类时,它可以指定它使用的单一方法T
。(比较这个最近的问题。)如果这似乎不是你要找的,那么请提供更多信息。
推荐阅读
- java - IBM Domino Java - 优化对特定 Internet 地址的 $(Rooms) 视图的搜索
- c - 尝试将所有制表符更改为一定数量的空格,K&R 练习 1-20
- mysql - 如何使用 JPA 查询获取最后的数据
- linux - 如何使用 GStreamer 和 VAAPi 解决 RAW 流播放问题
- ruby-on-rails - 在 Google Cloud Run 中使用 Sidekiq 的 Rails 作业不起作用
- amazon-web-services - RHat企业服务器7.7 EC2镜像突然关闭80端口
- javascript - reactjs如何恢复到之前的状态?
- javascript - 如何在Javascript中将问号包围的文本提取到数组中
- python - 如何使用 Azure API 检测情绪?
- excel - 将 Excel 工作表转换为 paradox DB