2016-10-18 77 views
10

我剛剛開始使用Angular2,我遇到了一個我無法理解的問題。屬性''在類型'對象'上不存在。 Observable訂閱

我有這樣創建了一些模擬數據:

export const WORKFLOW_DATA: Object = 
{ 
    "testDataArray" : [ 
     { key: "1",    name: "Don Meow", source: "cat1.png" }, 
     { key: "2", parent: "1", name: "Roquefort", source: "cat2.png" }, 
     { key: "3", parent: "1", name: "Toulouse", source: "cat3.png" }, 
     { key: "4", parent: "3", name: "Peppo", source: "cat4.png" }, 
     { key: "5", parent: "3", name: "Alonzo",  source: "cat5.png" }, 
     { key: "6", parent: "2", name: "Berlioz", source: "cat6.png" } 
    ] 
}; 

,然後將其在一個服務導入和「觀察到的」

import { Injectable } from '@angular/core'; 

import { WORKFLOW_DATA } from './../mock-data/workflow' 
import {Observable} from "rxjs"; 

@Injectable() 
export class ApiService { 

    constructor() { } 

    getWorkflowForEditor(): Observable<Object> 
    { 
     return Observable.of(WORKFLOW_DATA); 
    } 

} 

我然後有一個部件,其在構造:

constructor(private apiService: ApiService) 
    { 
     this.apiService.getWorkflowForEditor().subscribe(WORKFLOW_DATA => { 
      console.log(WORKFLOW_DATA); 
      console.log(WORKFLOW_DATA.testDataArray); 
     }); 
    } 

第一個console.log記錄一個Object類型的Object,它包含testDataArray屬性。

第二的console.log,導致在編譯時的誤差:

Property 'testDataArray' does not exist on type 'Object'. 

雖然仍在記錄對象的數組[對象,對象,..]如預期。

我真的不明白爲什麼,我確定我做錯了什麼,我很樂意解釋。

謝謝你的幫助!

回答

7

當你告訴打字稿:

WORKFLOW_DATA: Object

你說的是WORKFLOW_DATA是一個沒有屬性的普通對象。當您稍後嘗試訪問WORKFLOW_DATA.testDataArray時,編譯器認爲您濫用了該類型。

如果你想在WORKFLOW_DATA上進行類型檢查,你需要創建一個描述你的對象的接口。

+0

正如你所看到的,其他的答案建議使用任何,我個人感覺使用界面是正確的方法,儘管對於像這樣簡單的事情有點冗長。界面是Angular2的最佳實踐嗎? – 0plus1

+1

這個類型系統可以幫助你,特別是隨着應用程序的增長。如果你不想使用它,你不需要使用它 - 它對最終的javascript沒有任何影響。我(我認爲大多數人)喜歡它,因爲智能編輯器提供自動完成功能,並警告你犯錯誤。如果這是我的代碼,我可能會爲記錄創建一個類型 - 「{key:string,parent?:string ..}」,另一個用於包含記錄類型「{testDataArray:recordType []」的集合。 ..'或者類似的東西。 –

1

返回類型,如果您的方法是Observable<Object>。所以當你訂閱時,這將是通過的類型。 Object類型上沒有testDataArray。你可以做兩件事情:

  1. 類型的數據,並返回類型不同

    WORKFLOW_DATA: { testDataArray: any } = [] 
    
    getWorkflowForEditor(): Observable<{ testDataArray: any }> 
    
  2. 或者只輸入響應數據斷言到any

    console.log((<any>WORKFLOW_DATA).testDataArray); 
    
13

打字稿預計WORKFLOW_DATAObject這裏:

.subscribe(WORKFLOW_DATA => {}) 

因爲你告訴它這樣:

getWorkflowForEditor(): Observable<Object> 

Object沒有testDataArray財產...您應該告訴打字稿的數據可以有任何屬性:

getWorkflowForEditor(): Observable<any> 

或使用

console.log(WORKFLOW_DATA["testDataArray"]); 
相關問題