2017-10-09 44 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