【问题标题】:type observable<{}> is not assignable to any type:Property length is missing in type{} in Typescripttype observable<{}> 不可分配给任何类型:Typescript 中 type{} 中缺少属性长度
【发布时间】:2017-03-21 00:13:21
【问题描述】:

我正在尝试使用 Angular2 http 获取保存在本地系统中的 JSON 数据。

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 不可分配给类型“Observable”。类型“{}”不可分配给类型“General[]”。类型“{}”中缺少属性长度

这里的General是一个类名。我正在使用 rxjs-5.0。我正在关注 Angular.io Tour of hero 并制作我自己的项目。有什么帮助吗?

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    我更改了我的导入来源
    import { Observable } from 'rxjs/Observable';

    从 'rxjs' 导入 { Observable };
    这一切都奏效了

    【讨论】:

    • 不错的收获。遇到了同样的问题,谢谢你解决了。但为什么会这样。 'rxjs/Observable' 有什么问题?
    【解决方案2】:

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

    getStatus (): Observable<General[]>
    

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

    getStatus (): Observable<General> 
    

    【讨论】:

    • @Protagonist 你有 body.data,你确定你正在获取数据对象,因为如果你正在读取一个 json 文件,数据对象就会使用。试试这个返回体|| { };
    【解决方案3】:

    我会像这样调整extractData

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

    现在它说它将返回 General[] 并且它还断言 body.data 属于该类型。如果结果为空,则返回空数组

    【讨论】:

    • res.json() 不是any 类型的吗?如果是,那么您的输入将是多余的,因为 any 和空数组都与任何数组兼容。
    【解决方案4】:

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

    我猜您的问题出在return body.data || {} 中的extractData 中。请改用return body.data || []

    【讨论】:

      【解决方案5】:

      错误的分配不是来自extractData() 调用,而是来自catch() 调用。

      试试这个:

      getStatus(): Observable<General[]> {
          return this.http.get(this.statusUrl)
              .map(this.extractData)
              .catch<General[]>(this.handleError);
      }
      

      【讨论】:

        【解决方案6】:

        更新您的代码如下:

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

        【讨论】:

          猜你喜欢
          • 2018-11-11
          • 2021-10-04
          • 1970-01-01
          • 2019-06-04
          • 2017-12-24
          • 2019-02-08
          • 2023-03-07
          • 2017-12-05
          • 2019-08-18
          相关资源
          最近更新 更多