2017-10-09 41 views
0

JSON对象映射到打字稿对象我有下面的代码,这似乎错了:如何使用RxJS

public search(searchString: string): Observable<Array<ClientSearchResult>> { 
    let params = new HttpParams().set('searchString', searchString); 

    return this.http 
     .get<Array<ClientSearchResult>>(this.searchUrl, { params: params }) 
     .map((results: ClientSearchResult[]) => results.map((r: ClientSearchResult) => new ClientSearchResult(r))); 
} 

我知道,API返回一个JSON对象,它是不一样的我的打字稿的实例类。但是,我想使用TypeScript类中定义的属性。

有没有更好的方法将来自我的API调用的数组映射到实际由ClientSearchResult实例组成的数组?

这里是ClientSearchResult对象:

import { Name } from './name'; 

export class ClientSearchResult { 
    public id: string; 
    public name: Name; 
    public dateOfBirth: Date; 
    public socialSecurityNumber: string; 

    public get summary(): string { 
     let result: string = `${this.name}`; 

     if (this.dateOfBirth) 
      result += ` | ${this.dateOfBirth.toLocaleDateString()}`; 

     return result; 
    } 

    constructor(source: ClientSearchResult) { 
     this.id = source.id; 
     this.name = new Name(source.name); 
     this.dateOfBirth = source.dateOfBirth? new Date(source.dateOfBirth) : undefined; 
     this.socialSecurityNumber = source.socialSecurityNumber; 
    } 

    public toString(): string { 
     return this.summary; 
    } 
} 
+2

如果您不想手动设置许多属性,但无所谓全部,您可以使用Object.assign(new ClientSearchResult(),decodedJsonObject)。 – martin

+0

你能告诉我们,ClientSearchResult的构造函数吗?也许'新的ClientSearchResult(r)'不是将转换应用到ClientSearchResult实例的方式。 – Luillyfe

+0

@Luillyfe我已经更新了这个问题。 – mlindegarde

回答

1

正如你可以尝试打字稿as运营商的内容投射到ClientSearchResult类型的API响应的选项。

import { Http, Response } from '@angular/http'; 

public search(searchString: string): Observable<ClientSearchResult[]> { 
    const params = new HttpParams().set('searchString', searchString); 
    return this.http.get(this.searchUrl, { params: params }) 
     .map((results: Response) => results.json() as ClientSearchResult[]); 
} 

这种方法需要你的模型类被作为接口,或仅仅是一个接口:

interface ClientSearchResult { 
    id: number; 
    // etc 
} 
+0

感谢您的建议。但是,我试图使用新的'HttpClient'而不是'Http'。 'HttpClient'给了我一个类型数组,而不是'Response'。我会研究'as'运营商,看看我能做些什么。 – mlindegarde