首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >键入“Observable<Entity[]>”不能指定键入“Entity[]”

键入“Observable<Entity[]>”不能指定键入“Entity[]”
EN

Stack Overflow用户
提问于 2018-06-14 04:54:14
回答 3查看 1.5K关注 0票数 0

嗨,我正在学习使用版本6的角度。我试图映射一个基本的http响应并返回到一个Observable中,但是,我得到了这个类型的转换错误。

market-data.component.ts

代码语言:javascript
复制
import { Component, OnInit, Inject } from "@angular/core";
import { MarketDataService } from "./market-data.service";
import { CoinMarketCapTokenEntity } from "../entity/coinmarketcaptoken-entity";

@Component({
    selector: "app-market-data",
    templateUrl: "./src/app/market-data.component.html"
})
export class MarketDataComponent implements OnInit {
    private _marketDataService: MarketDataService;
    private _tokens: CoinMarketCapTokenEntity[];

    constructor(marketDataService: MarketDataService) {
        this._marketDataService = marketDataService;
    }

    ngOnInit() {
        this._tokens = this._marketDataService.getCoinMarketCapTokens();
    }
}

market-data-service

代码语言:javascript
复制
import { Injectable } from "@angular/core";
import { Http, Response, Headers } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import { CoinMarketCapTokenEntity } from "../entity/coinmarketcaptoken-entity";

const coinMarketcapCoinsUrl = "https://s2.coinmarketcap.com/generated/search/quick_search.json";

@Injectable()
export class MarketDataService {
    private _http: Http;

    constructor(http: Http) {
        this._http = http;
    }

    getCoinMarketCapTokens(): Observable<CoinMarketCapTokenEntity[]> {
        return this._http.get(coinMarketcapCoinsUrl, {headers: this.getHeaders()})
                               .map(this.mapTokens);
    }

    mapTokens(response: Response): CoinMarketCapTokenEntity[] {
        return response.json().map(this.toCoinMarketCapToken);
    }

    toCoinMarketCapToken(r: any): CoinMarketCapTokenEntity {
        let token = <CoinMarketCapTokenEntity>({
            name: r.name,
            symbol: r.symbol,
            rank: r.rank,
            slug: r.slug,
            tokens: r.tokens,
            id: r.id
        });
        return token;
    }

    getHeaders() {
        let headers = new Headers();
        headers.append("Accept", "application/json");
        return headers;
    }
}

我所犯的错误是

代码语言:javascript
复制
src/app/market-data.component.ts(18,9): error TS2322: Type 'Observable<CoinMarketCapTokenEntity[]>' is not assignable to type 'CoinMarketCapTokenEntity[]'.
[1]   Property 'length' is missing in type 'Observable<CoinMarketCapTokenEntity[]>'

我还检查了这里重复的问题- Observable<{}> not assignable to type Observable

然而,所有的解决办法都没有奏效。谢谢你的帮忙

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-14 05:07:16

您只需使用subscribe方法将可观察的模型转换为模型。

票数 1
EN

Stack Overflow用户

发布于 2018-06-14 05:20:21

您正在混合旧版本和新版本编码风格。有几件事,您应该修改到您的代码,1。您应该使用HttpHeaders(可以从@ are /angular/http导入)而不是头文件。2.不需要像在

代码语言:javascript
复制
return this._http.get(coinMarketcapCoinsUrl, {headers: this.getHeaders()})
                           .map(this.mapTokens);

http.get()本身返回可观察的结果。为了从可观察到的地方检索数据,您可以在上面使用订阅()方法。

  1. 不需要像在代码中那样,在响应时调用map。 返回response.json().map(this.toCoinMarketCapToken); response.json()将为您提供一个承诺对象,而承诺对象没有map方法。您必须调用然后()方法从其中检索数据。
票数 1
EN

Stack Overflow用户

发布于 2018-06-14 06:41:46

下面的代码可以工作。

代码语言:javascript
复制
import { Injectable } from "@angular/core";
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';
const coinMarketcapCoinsUrl = "https://s2.coinmarketcap.com/generated/search/quick_search.json";

@Injectable()
export class MarketDataService {

    constructor(private _http: HttpClient) {

    }
    getCoinMarketCapTokens(): Observable<CoinMarketCapTokenEntity[]> {
          return this._http.get<CoinMarketCapTokenEntity[]>(coinMarketcapCoinsUrl);
    }

}

export class CoinMarketCapTokenEntity{
    name;
    symbol;
    rank;
    slug;
    tokens;
    id;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50849838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档