【问题标题】:Pass generic type as type parameter将泛型类型作为类型参数传递
【发布时间】:2019-02-27 10:07:51
【问题描述】:

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

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&lt;UserModel&gt;&gt;,或者对于与资源相关的调用,它将是 HttpResponse&lt;ResourceModel&gt;&gt;。但是,尝试此操作时,我似乎没有任何运气。

在我的数据服务中,我有一个 POSTS 到服务器的方法,称为“创建”和

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

然后我有一个服务,它扩展了这个类,并在调用 super.create 之前用一些额外的位重载​​了 create 方法。我此时遇到了问题,因为我想传入HttpResponse&lt;Type the service should return&gt;,在以下情况下为HttpResponse&lt;UserModel&gt;

create<HttpResponse<UserModel>>(user: UserModel){
  //stuff happens here
  return super.create<HttpResponse<UserModel>>(user, ...);
}

但是,这会在 create&lt;HttpResponse&lt;UserModel&gt;&gt; 处返回语法错误。 我在网上看了看,发现了另一种实现这一目标的方法:

create<HttpResponse, UserModel>(user: any){
  //stuff happens here
  return super.create<HttpResponse<UserModel>>(user, ...);
}

但是,这又会返回一个错误,指出“HttpResponse 不是通用的”。

设计思路是通过这种方式传入类型,可以将来自服务端的json响应自动映射成合适的类型,使得响应在整个应用中的使用变得简单

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

【问题讨论】:

  • 谁是super.create?您是否计划从HttpResponse 派生类,或者它只是一个并且您只想传递结果的类型?你想实例化结果类型的实例还是只返回 json 值作为结果?您能否详细说明一下您的用例。
  • @TitianCernicova-Dragomir 抱歉,我试图保持简单以避免混淆,但我会更新帖子。但是,正如您所说,主要目的是只有一个 HttpResponse 类可以接受我们期望的任何类型的结果。例如HttpResponse&lt;BookingModle&gt;HttpResponse&lt;UserModel&gt;
  • 简单是好的,但也必须清楚你想要达到的目标,这是一个微妙的平衡:)
  • @TitianCernicova-Dragomir 非常正确,如果编辑增加了一些清晰度,请告诉我!

标签: javascript angular typescript generics types


【解决方案1】:

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

【讨论】:

  • 非常感谢,我知道我在做一些愚蠢的事情。用 标记了我的 dataService,然后在 dataService 创建方法中我返回:return this.http.post&lt;HttpResponse&lt;T&gt;&gt;(data, ...); 这似乎更有意义!
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2022-11-28
相关资源
最近更新 更多