Свойство '' не существует для типа 'Объект'. Наблюдаемая подписка
Я только начал с 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
тип. Вы можете сделать пару вещей:
Введите данные и тип возврата по-разному
WORKFLOW_DATA: { testDataArray: any } = [] getWorkflowForEditor(): Observable<{ testDataArray: any }>
Или просто введите 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);
}