2016-11-07 106 views
3

我试图使用Angular2 http获取保存在本地系统中的JSON数据。类型observable <{}>不可分配给任何类型:在Typescript中的{}类型中缺少属性

import { Injectable }  from '@angular/core'; 
import { Http, Response } from '@angular/http'; 
import { General }  from './general'; 
import { Observable }  from 'rxjs/Observable'; 

@Injectable() 
export class GeneralService { 
    // #docregion endpoint 
    private statusUrl = './jsondata'; // URL to web API 
    // #enddocregion endpoint 

    // #docregion ctor 
    constructor (private http: Http) {} 
    // #enddocregion ctor 

    // #docregion methods, error-handling, http-get 
    getStatus(): Observable<General[]> { 
     return this.http.get(this.statusUrl) 
      .map(this.extractData) 
      .catch(this.handleError); 
    } 
private extractData(res: Response) { 
     let body = res.json(); 
     return body.data || { }; 
    } 


    private handleError (error: Response | any) { 
     // In a real world app, we might use a remote logging infrastructure 
     let errMsg: string; 
     if (error instanceof Response) { 
      const body = error.json() || ''; 
      const err = body.error || JSON.stringify(body); 
      errMsg = `${error.status} - ${error.statusText || ''} ${err}`; 
     } else { 
      errMsg = error.message ? error.message : error.toString(); 
     } 
     console.error(errMsg); 
     return Observable.throw(errMsg); 
    } 

} 

我得到无差错类型观察到< {}>是不能分配给输入“Observable'.Type '{}' 不是分配给键入 '常规[]'。类型'{}'中缺少属性长度

这里一般是类名。我使用rxjs-5.0。我正在关注Angular.io英雄之旅并制作自己的项目。对此有何帮助?

回答

0

编译器说你试图给一个数组(通用)分配一个对象。

我想你的问题在return body.data || {}extractData。改为尝试return body.data || []

+0

我试过了。仍然是相同的错误 – Protagonist

0

我会调整extractData这样的:

private extractData(res: Response): General[] { 
    let body = res.json(); 
    return (body.data || []) as General[]; 
} 

现在它说,它会返回General[]并且还断言body.data是那种类型的。在空结果的情况下,空数组返回

+0

不是'any'类型的res.json()吗?如果是,那么你的输入将是多余的,因为'any'和一个空数组都兼容任何数组。 – Alex

+0

@Radim还是一样的错误 – Protagonist

0

问题是,您正在告诉observable在获取对象时获取一个Genral列表。

getStatus(): Observable<General[]> 

如果你不接受一个数组,那么你应该做这样的

getStatus(): Observable<General> 
+0

我试过了。还是同样的错误 – Protagonist

+0

@Protagonist你有body.data,你确定你正在获取数据对象如果你正在阅读一个json文件,使用数据对象。试试这个 return body || {}; –

0

坏分配不从extractData()呼叫,但在该catch()一个未来。

试试这个:

​​
2

更新您的代码如下:

getStatus(): Observable<Genral[]> { 
    return this.http.get(this.statusUrl) 
    .map((res) => this.extractData(res)) 
    .catch((err) => this.handleError(err)); 
} 
相关问题