2016-11-07 104 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)); 
} 
相關問題