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

Я только начал с 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.

Второй файл console.log приводит к ошибке во время компиляции:

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

При этом ведение журнала массива объектов [Object, Object, ..] по назначению.

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

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

4 ответа

Решение

Когда вы говорите машинопись:

WORKFLOW_DATA: Object

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

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

Машинопись ожидает WORKFLOW_DATA быть Object Вот:

.subscribe( WORKFLOW_DATA => {} )

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

  getWorkflowForEditor(): Observable<Object>

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

  getWorkflowForEditor(): Observable<any>

или использовать

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

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

  1. Введите данные и тип возврата по-разному

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

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

Добавить наблюдаемый

в методе service.ts, на который вы подписываетесь. В Observable вы можете ссылаться на объект типа или упоминать, чтобы принимать все типы записей.

      getResponse(query: string): Observable<any> {
    let data = {
      query: query,
      lang: "en",
      sessionId: "1234567",
    };
    return this.http.post(this.baseURL, data);
  }
Другие вопросы по тегам