类型'对象'上不存在属性''.可观察的订阅

0pl*_*us1 16 observable rxjs typescript angular

我刚刚开始使用Angular2,我遇到了一个我无法理解的问题.

我有一些这样的模拟数据:

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" }
    ]
};
Run Code Online (Sandbox Code Playgroud)

然后将其导入服务并"观察"

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 );
  }

}
Run Code Online (Sandbox Code Playgroud)

然后我有一个组件,在构造函数中:

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

第一个console.log记录一个Object类型的Object,它包含testDataArray属性.

第二个console.log在编译时导致错误:

Property 'testDataArray' does not exist on type 'Object'.
Run Code Online (Sandbox Code Playgroud)

同时仍按预期记录对象数组[Object,Object,..].

我真的不明白为什么,我确信我做错了什么,我会喜欢解释.

感谢您的任何帮助!

Sas*_*sxa 25

打字稿希望WORKFLOW_DATAObject这里:

.subscribe( WORKFLOW_DATA => {} )
Run Code Online (Sandbox Code Playgroud)

因为你告诉过它:

  getWorkflowForEditor(): Observable<Object>
Run Code Online (Sandbox Code Playgroud)

但是Object没有testDataArray属性......您应该告诉TypeScript数据可以具有任何属性:

  getWorkflowForEditor(): Observable<any>
Run Code Online (Sandbox Code Playgroud)

或使用

console.log( WORKFLOW_DATA["testDataArray"] );
Run Code Online (Sandbox Code Playgroud)


Mar*_*yer 11

当你告诉打字稿时:

WORKFLOW_DATA: Object

你告诉它这WORKFLOW_DATA是一个没有属性的普通对象.当您稍后尝试访问时WORKFLOW_DATA.testDataArray,编译器会认为您滥用了该类型.

如果要进行类型检查,则WORKFLOW_DATA需要创建描述对象的接口.


Pau*_*tha 5

如果你的方法是返回类型Observable<Object>.因此,当您订阅时,这将是传递的类型.而且也没有testDataArrayObject类型.你可以做几件事:

  1. 以不同方式键入数据和返回类型

    WORKFLOW_DATA: { testDataArray: any } = []
    
    getWorkflowForEditor(): Observable<{ testDataArray: any }>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者只是键入断言响应数据 any

    console.log( (<any>WORKFLOW_DATA).testDataArray );
    
    Run Code Online (Sandbox Code Playgroud)