Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Property '' does not exist on type 'Object'. Observable subscribe

Tags:

I have just started with Angular2 and I've got an issue I cannot really understand.

I have some mock data created as such:

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" }     ] }; 

Which is then imported in a service and "observed"

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

I then have a component which, in the constructor:

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

The first console.log logs an Object of type Object which contains the testDataArray property.

The second console.log, results in an error at compile time:

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

While still logging an array of objects [Object, Object, ..] as intended.

I really do not understand why, I am sure I am doing something wrong, I would love an explanation.

Thank you for any help!

like image 299
0plus1 Avatar asked Oct 18 '16 00:10

0plus1


People also ask

How do you fix property does not exist on type?

The "Property does not exist on type '{}'" error occurs when we try to access or set a property that is not contained in the object's type. To solve the error, type the object properties explicitly or use a type with variable key names. Copied!

Does not exist on type string?

The "Property does not exist on type String" error occurs when we try to access a property that does not exist on the string type. To solve the error, use an object instead of a string, or make sure you're accessing a valid built-in method on the string.


2 Answers

Typescript expects WORKFLOW_DATA to be Object here:

.subscribe( WORKFLOW_DATA => {} ) 

because you told it so:

  getWorkflowForEditor(): Observable<Object> 

But Object doesn't have testDataArray property... You should either tell TypeScript that data can have any properties:

  getWorkflowForEditor(): Observable<any> 

or use

console.log( WORKFLOW_DATA["testDataArray"] ); 
like image 187
Sasxa Avatar answered Sep 19 '22 21:09

Sasxa


When you tell typescript:

WORKFLOW_DATA: Object

You are telling it that WORKFLOW_DATA is a plain object with no attributes. When you later try to access WORKFLOW_DATA.testDataArray the compiler thinks you misusing the type.

If you want type checking on WORKFLOW_DATA you need to create an interface that describes your object.

like image 36
Mark Avatar answered Sep 21 '22 21:09

Mark