0pl*_*us1 16 observable rxjs typescript angular
我刚刚开始使用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" }
]
};
Run Code Online (Sandbox Code Playgroud)
然后将其导入服务并"观察"
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 );
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个组件,在构造函数中:
constructor( private apiService: ApiService)
{
this.apiService.getWorkflowForEditor().subscribe( WORKFLOW_DATA => {
console.log( WORKFLOW_DATA);
console.log( WORKFLOW_DATA.testDataArray );
} );
}
Run Code Online (Sandbox Code Playgroud)
第一个console.log记录一个Object类型的Object,它包含testDataArray属性.
第二个console.log在编译时导致错误:
Property 'testDataArray' does not exist on type 'Object'.
Run Code Online (Sandbox Code Playgroud)
同时仍按预期记录对象数组[Object,Object,..].
我真的不明白为什么,我确信我做错了什么,我会喜欢解释.
感谢您的任何帮助!
Sas*_*sxa 25
打字稿希望WORKFLOW_DATA在Object这里:
.subscribe( WORKFLOW_DATA => {} )
Run Code Online (Sandbox Code Playgroud)
因为你告诉过它:
getWorkflowForEditor(): Observable<Object>
Run Code Online (Sandbox Code Playgroud)
但是Object没有testDataArray属性......您应该告诉TypeScript数据可以具有任何属性:
getWorkflowForEditor(): Observable<any>
Run Code Online (Sandbox Code Playgroud)
或使用
console.log( WORKFLOW_DATA["testDataArray"] );
Run Code Online (Sandbox Code Playgroud)
Mar*_*yer 11
当你告诉打字稿时:
WORKFLOW_DATA: Object
你告诉它这WORKFLOW_DATA是一个没有属性的普通对象.当您稍后尝试访问时WORKFLOW_DATA.testDataArray,编译器会认为您滥用了该类型.
如果要进行类型检查,则WORKFLOW_DATA需要创建描述对象的接口.
如果你的方法是返回类型Observable<Object>.因此,当您订阅时,这将是传递的类型.而且也没有testDataArray对Object类型.你可以做几件事:
以不同方式键入数据和返回类型
WORKFLOW_DATA: { testDataArray: any } = []
getWorkflowForEditor(): Observable<{ testDataArray: any }>
Run Code Online (Sandbox Code Playgroud)或者只是键入断言响应数据 any
console.log( (<any>WORKFLOW_DATA).testDataArray );
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
32342 次 |
| 最近记录: |