Je viens de commencer avec Angular2 et j'ai un problème que je ne peux pas vraiment comprendre.
J'ai des données fictives créées en tant que telles:
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" }
]
};
Qui est ensuite importé dans un service et "observé"
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 );
}
}
J'ai alors un composant qui, dans le constructeur:
constructor( private apiService: ApiService)
{
this.apiService.getWorkflowForEditor().subscribe( WORKFLOW_DATA => {
console.log( WORKFLOW_DATA);
console.log( WORKFLOW_DATA.testDataArray );
} );
}
Le premier console.log enregistre un objet de type Object qui contient la propriété testDataArray.
Le deuxième console.log, entraîne une erreur au moment de la compilation:
Property 'testDataArray' does not exist on type 'Object'.
Tout en enregistrant un tableau d'objets [Object, Object, ..] comme prévu.
Je ne comprends vraiment pas pourquoi, je suis sûr que je fais quelque chose de mal, j'aimerais une explication.
Merci pour toute aide!
Lorsque vous dites à TypeScript:
WORKFLOW_DATA: Object
Vous lui dites que WORKFLOW_DATA
est un objet simple sans attribut. Lorsque vous essayez ultérieurement d'accéder à WORKFLOW_DATA.testDataArray
le compilateur pense que vous abusez du type.
Si vous voulez vérifier le type sur WORKFLOW_DATA
vous devez créer une interface qui décrit votre objet.
TypeScript attend WORKFLOW_DATA
être Object
ici:
.subscribe( WORKFLOW_DATA => {} )
parce que tu l'as dit:
getWorkflowForEditor(): Observable<Object>
Mais Object
n'a pas de propriété testDataArray
... Vous devez indiquer à TypeScript que les données peuvent avoir n'importe quelle propriété:
getWorkflowForEditor(): Observable<any>
ou utiliser
console.log( WORKFLOW_DATA["testDataArray"] );
Le type de retour si votre méthode est Observable<Object>
. Ainsi, lorsque vous vous abonnerez, ce sera le type passé. Et il n'y a pas de testDataArray
sur le type Object
. Vous pouvez faire quelques choses:
Saisissez les données et renvoyez le type différemment
WORKFLOW_DATA: { testDataArray: any } = []
getWorkflowForEditor(): Observable<{ testDataArray: any }>
Ou tapez simplement assert the data response to any
console.log( (<any>WORKFLOW_DATA).testDataArray );