【发布时间】: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<UserModel>>,或者对于与资源相关的调用,它将是 HttpResponse<ResourceModel>>。但是,尝试此操作时,我似乎没有任何运气。
在我的数据服务中,我有一个 POSTS 到服务器的方法,称为“创建”和
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响应自动映射成合适的类型,使得响应在整个应用中的使用变得简单
任何关于我的设计哪里出错的指针?
【问题讨论】:
-
谁是
super.create?您是否计划从HttpResponse派生类,或者它只是一个并且您只想传递结果的类型?你想实例化结果类型的实例还是只返回 json 值作为结果?您能否详细说明一下您的用例。 -
@TitianCernicova-Dragomir 抱歉,我试图保持简单以避免混淆,但我会更新帖子。但是,正如您所说,主要目的是只有一个 HttpResponse 类可以接受我们期望的任何类型的结果。例如
HttpResponse<BookingModle>或HttpResponse<UserModel>等 -
简单是好的,但也必须清楚你想要达到的目标,这是一个微妙的平衡:)
-
@TitianCernicova-Dragomir 非常正确,如果编辑增加了一些清晰度,请告诉我!
标签: javascript angular typescript generics types