私は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は、testDataArrayプロパティを含むObject型のオブジェクトを記録します。
2番目のconsole.logでは、コンパイル時にエラーが発生します。
Property 'testDataArray' does not exist on type 'Object'.
オブジェクトの配列[Object、Object、..]を意図したとおりに記録します。
私は本当に理由を理解していません、私は何か間違ったことをしていると確信しています、私は説明が大好きです。
助けてくれてありがとう!
TypeScriptに伝えるとき:
WORKFLOW_DATA: Object
WORKFLOW_DATA
は属性のないプレーンなオブジェクトであることを伝えています。後でWORKFLOW_DATA.testDataArray
にアクセスしようとすると、コンパイラはあなたが型を誤用していると考えます。
WORKFLOW_DATA
の型チェックが必要な場合は、オブジェクトを記述するインターフェイスを作成する必要があります。
TypeScriptは、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 }>
または、any
への応答データをアサートするだけで入力します
console.log( (<any>WORKFLOW_DATA).testDataArray );