可观察的http映射看起来像而不是实际的

时间:2017-03-09 13:57:27

标签: angular typescript rxjs observable

所以,似乎我对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())
    }

1 个答案:

答案 0 :(得分:1)

使用interface,而不是class。如果不手动调用类构造函数,则无法将JSON对象反序列化为类。简单地分配或返回兼容类型对运行时行为没有影响。

有人认为这是另一个问题的副本,但问题的答案很差,因为它建议你遵循非常糟糕的编码习惯。

即使您手动调用类构造函数,您的数据也不会是同构的。保持逻辑不受您的回复和请求类型的影响。

您应该描述通过带有接口的HTTP请求检索和发送的对象的形状。

这样做的原因是界面只是一种类型而反序列化功能(此处为.json)已经为您创建了值,因此您只需要&#34; cast&#34;它。这实际上就是你当前正在做的事情,但由于你要转换的类型对应于一个类,因此它具有误导性,因为反序列化器创建的对象不是由类构造函数创建的实例。

请记住将Angular 2文档示例与使用TypeScript相关联。他们没有很好地使用这种语言,也不是惯用语。