2017-02-17 35 views
0

我有對象數組,每個對象都包含;將大json對象映射到打字稿中的模型對象

{ 
Id:"..", 
name:"..", 
foo1:"..", 
foo2:"..", 
... 
} 

我只需要這些項目的2個屬性,所以我創建了一個接口;低於此方法內

export interface IMenuModel{ 
    Id:number; 
    name?:string;  
} 

和檢索數據:

fetch(`..`).then((response: Response): Promise<{ value:IMenuModel[] }> => { 
        return response.json(); 
       }) 
       .then((response: { value: IMenuModel[] }): void => { 
        debugger //expected response is array of IMenuModel but it still contains all properties 

我期望該響應對象作爲我的自定義模型(IMenuModel)的陣列,但它仍含有從遠程源檢索所有屬性。我可以使用「.map()」函數摘取它們,但可以返回類型定義爲函數(response: { value: IMenuModel[] }),所以我不應該這樣做(或者我必須每次手動映射它)。

爲什麼仍然不響應我的對象模型和什麼是最有效的方法來實現呢?

回答

1

TypeScript主要是一個JavaScript類型的圖層。這些類型不會改變輸入的對象。當轉譯成JavaScript時,類型簡單地被丟棄。如果將接口(或多個接口)應用於JSON對象,則不會更改對象的性質,只需聲明該接口的保證即可。

所以,當你定義你的IMenuModel接口並將它應用到你導入的對象時,你會說:「我知道,我可以保證給定的對象提供在接口中定義的成員。這個保證是滿足你的對象,所以一切都很好。然而,物體仍然傳遞並恢復其全部的榮耀。考慮接口爲最低保證,不作爲對象的完整描述。

如果您不想添加對象的其他成員,唯一的選擇是讓服務器只發送您需要的對象的部分。如果你不能這樣做,你不需要擔心,因爲你的對象滿足界面的最低要求。只要忽略附加值。

+0

是的,現在更有意義了,謝謝。 – TyForHelpDude