2016-10-18 76 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"]); 
相关问题