将泛型类型作为类型参数传递



我正在努力为我面临的问题提出解决方案,我正在尝试使用泛型类型作为类型参数。 我有以下两个类/类型:

UserModel.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>>。但是,在尝试这个时,我似乎没有任何运气。

在我的数据服务中,我有一个名为"创建"的服务器 POST 到服务器的方法和

create<T>(data: any){
//Angular's HttpClient
return this.http.post<T>(data, ...);
}

然后,我有一个服务来扩展这个类,并在调用super.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 响应可以自动映射到适当的类型,从而可以轻松地在整个应用程序中使用响应

关于我在设计中出错的地方的任何指示?

子类必须维护其基类的整个接口(除了一些与此处无关的例外(。 如果数据服务基类包含泛型且适用于每个Tcreate方法,则子类不能使用仅适用于T = HttpResponse<UserModel>的方法重写create。 相反,请考虑 (1( 定义具有不同名称的新方法,或 (2( 将T参数从create方法移动到基类本身,以便在子类扩展基类时,它可以指定它使用的单个T。 (与最近的这个问题相比。 如果这似乎不是您要找的,那么请提供更多信息。

最新更新