首页 > 解决方案 > 将泛型类型作为类型参数传递

问题描述

我正在努力想出一个解决我面临的问题的方法,我试图将泛型类型用作类型参数。我有以下两个类/类型:

用户模型.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响应自动映射到合适的类型,使得响应在整个应用中的使用变得简单

关于我的设计哪里出错的任何指示?

标签: javascriptangulartypescriptgenericstypes

解决方案


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


推荐阅读