所以,似乎我对Typescript
有一些很大的误解考虑到这些代码片段,我希望在返回的observable上有一个方法getTitle()
,但它不在那里。我只是有一个看起来像AttachabeContentModel
的对象而没有这个方法。是什么给了什么?
export class AttachableContentModel extends AbstractPopupModel {
Url: string;
EmailAddress: string;
StreetViewUrl: string;
Images: Array<ImageModel>;
Videos: Array<VideoModel>;
Documents: Array<DocumentModel>;
getTitle(): string {
if (this.Name &&
this.DisplayName &&
this.Name !== this.DisplayName)
return this.Name + " (" + this.DisplayName + ")";
return this.Name ? this.Name : this.DisplayName;
};
Silly: string;
}
...
fecthAttachableContent(request: AttachableContentRequest): Observable<AttachableContentModel> {
return this.http
.postAsJson(`${environment.apiBaseUrl}attachablecontent`, {})
.map(res => res.json())
}
答案 0 :(得分:1)
使用interface
,而不是class
。如果不手动调用类构造函数,则无法将JSON对象反序列化为类。简单地分配或返回兼容类型对运行时行为没有影响。
有人认为这是另一个问题的副本,但问题的答案很差,因为它建议你遵循非常糟糕的编码习惯。
即使您手动调用类构造函数,您的数据也不会是同构的。保持逻辑不受您的回复和请求类型的影响。
您应该描述通过带有接口的HTTP请求检索和发送的对象的形状。
这样做的原因是界面只是一种类型而反序列化功能(此处为.json
)已经为您创建了值,因此您只需要&#34; cast&#34;它。这实际上就是你当前正在做的事情,但由于你要转换的类型对应于一个类,因此它具有误导性,因为反序列化器创建的对象不是由类构造函数创建的实例。
请记住将Angular 2文档示例与使用TypeScript相关联。他们没有很好地使用这种语言,也不是惯用语。