传递通用类型作为类型参数

时间:2018-09-23 20:48:02

标签: javascript angular typescript generics types

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

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>>。但是,尝试此操作时似乎没有运气。

在我的数据服务中,我有一个方法称为“ create”和

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响应自动映射为适当的类型,从而简化了在整个应用程序中使用响应的过程

关于我在设计中哪里出错的任何指针?

1 个答案:

答案 0 :(得分:0)

子类必须维护其基类的整个接口(某些与此处无关的例外)。如果您的数据服务基类包含一个通用的create方法并且适用于每个 T,则您的子类无法使用仅适用的方法覆盖create T = HttpResponse<UserModel>。相反,请考虑(1)用不同的名称定义一个新方法,或者(2)将T方法中的create参数移至基类本身,以便当您的子类扩展基类时,它可以指定与其一起使用的单个T。 (与this recent question比较。)如果这不是您要找的内容,请提供更多信息。