2016-04-28 27 views
7

我創建了一個基於Angular2教程的非常簡單的應用程序。angular2作爲特定對象類型的地圖數據

首先,我有一個非常簡單的「書」的模式:

/** 
* book model 
*/ 
export class Book { 
    public data; 

    /** 
    * constructor 
    * @param id 
    * @param title 
    * @param pages 
    */ 
    constructor(
     public id, 
     public title:string, 
     public pages:Array 
    ){ 
     alert('it works'); // just a check 
    } 
} 

在我的服務,我得到這樣一本書:

return this._http.get('getBook/1') 
     .map(function(res){ 
      return <Book> res.json(); 
     }) 

我的期望是,這會得到生成JSON數據並將其「映射」到Book對象。

但是,它只是返回一個類型爲「Object」的對象。

我可以創建一個新的Book對象自己和傳遞參數的構造函數,像這樣:

return new Book(res.id, res.title, res.pages); 

這是做到這一點的最好方法是什麼?我錯過了什麼?

回答

10

是的,在TypeScript中將對象轉換爲類型不會創建此類型的實例。這只是TypeScript用於類型檢查的一個工具。

如果你真的想你需要使用類似的東西的Book一個實例:

return this._http.get('getBook/1') 
    .map(function(res){ 
     var data = res.json(); 
     return new Book(data.id, data.title, data.pages); 
    }) 

要回答你的問題。事實上,如果你只有字段到你的類型(例如一個接口),鑄造就足夠了。此外,如果您有以後要使用的方法,則需要隱式創建Book類型的實例(請參見上文)而不是強制轉換。否則,你將無法使用它們(他們將你的對象是不確定的)...

詳情請參見這個問題:

4

我想你應該聲明接口Book,而不是book類:

export interface Book { 
    public id; 
    public title:string; 
    public pages:Array; 
} 

在服務:

//get one record 
return this._http.get('getBook/1') 
     .map(function(res){ 
      return <Book> res.json(); 
     }); 

//get multi record 
return this._http.get('getBooks') 
     .map(function(res){ 
      return <Book> res.json(); 
     }); 
3

良好實踐是使用以消耗

Observable<Model> 

(關於對角文檔https://angular.io/guide/http) 然後從GET響應數據:

//進口

import {HttpClient} from "@angular/common/http"; 

//在構造函數參數列表中

private http: HttpClient 

//服務方法

getBook(): Observable<Book> {return this.http.get<Book>({url}, {options});} 
相關問題