Свойство '' не существует в типе 'Object'. Наблюдаемая подписка

Я только что начал с 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" }
    ]
};

который затем импортируется в службу и "наблюдается"

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, который содержит свойство testDataArray.

Вторая консоль .log приводит к ошибке во время компиляции:

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

Пока все еще регистрируется массив объектов [Object, Object,..], как предполагалось.

Я действительно не понимаю, почему, я уверен, что я делаю что-то неправильно, я бы хотел объяснить.

Спасибо за помощь!

Ответ 1

Когда вы скажете typescript:

WORKFLOW_DATA: Object

Вы говорите, что WORKFLOW_DATA - простой объект без атрибутов. Когда вы позже попытаетесь получить доступ к WORKFLOW_DATA.testDataArray, компилятор подумает, что вы неправильно используете этот тип.

Если вам нужна проверка типов на WORKFLOW_DATA, вам необходимо создать интерфейс, описывающий ваш объект.

Ответ 2

Typescript ожидает WORKFLOW_DATA Object здесь:

.subscribe( WORKFLOW_DATA => {} )

потому что вы так сказали:

  getWorkflowForEditor(): Observable<Object>

Но Object не имеет свойства testDataArray... Вы должны либо сообщить TypeScript, что данные могут иметь любые свойства:

  getWorkflowForEditor(): Observable<any>

или используйте

console.log( WORKFLOW_DATA["testDataArray"] );

Ответ 3

Возвращаемый тип, если ваш метод Observable<Object>. Поэтому, когда вы подписываетесь, это будет пройденный тип. И нет testDataArray для типа Object. Вы можете сделать пару вещей:

  • Введите тип данных и возвращаемых данных по-разному

    WORKFLOW_DATA: { testDataArray: any } = []
    
    getWorkflowForEditor(): Observable<{ testDataArray: any }>
    
  • Или просто введите утвердительные данные ответа на any

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