Angular 类型';可观察<;实体[]>';不可分配给类型';实体[]和#x27;
大家好,我正在学习第6版。我试图映射一个基本的http响应并返回一个Angular 类型';可观察<;实体[]>';不可分配给类型';实体[]和#x27;,angular,typescript,systemjs,angular2-observables,Angular,Typescript,Systemjs,Angular2 Observables,大家好,我正在学习第6版。我试图映射一个基本的http响应并返回一个可观察的,但是,我得到了这种类型的转换错误 市场数据.component.ts import { Component, OnInit, Inject } from "@angular/core"; import { MarketDataService } from "./market-data.service"; import { CoinMarketCapTokenEntity } from "../entity/coinma
可观察的,但是,我得到了这种类型的转换错误
市场数据.component.ts
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();
}
}
市场数据服务
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;
}
}
从“@angular/core”导入{Injectable};
从'@angular/Http'导入{Http,Response,Headers};
从“rxjs/Observable”导入{Observable};
导入'rxjs/add/operator/map';
从“./实体/coinmarketcaptoken实体”导入{CoinMarketCapTokenEntity};
const coinMarketcapCoinsUrl=”https://s2.coinmarketcap.com/generated/search/quick_search.json";
@可注射()
导出类MarketDataService{
私有http:http;
构造函数(http:http){
这是http=http;
}
getCoinMarketCapTokens():可观察{
返回此。\u http.get(coinMarketcapCoinsUrl,{headers:this.getHeaders()})
.map(此.maptokes);
}
mapTokens(响应:响应):CoinMarketCaptokenity[]{
返回response.json().map(this.toCoinMarketCapToken);
}
toCoinMarketCapToken(r:any):CoinMarketCaptokenity{
让令牌=({
姓名:r.name,
符号:r.symbol,
等级:r.rank,
鼻涕虫:鼻涕虫,
代币:r.代币,
id:r.id
});
返回令牌;
}
getHeaders(){
let headers=新的headers();
headers.append(“接受”、“应用程序/json”);
返回标题;
}
}
我犯的错误是
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[]>'
src/app/market data.component.ts(18,9):错误TS2322:类型“Observable”不可分配给类型“CoinMarketCaptokenity[]”。
[1] 类型“Observable”中缺少属性“length”
我还检查了这里的重复问题-
然而,所有的解决方案都不起作用。感谢您的帮助您只需使用subscribe
方法将可观测模型转换为您的模型 您只需使用subscribe
方法将可观测模型转换为您的模型 您混合了旧版本和新版本的编码风格。有几件事,你应该改变你的代码,
1.您应该使用HttpHeaders(可以从@angular/common/http导入)而不是headers。
2.不需要像在中那样在web服务响应时调用map
return this._http.get(coinMarketcapCoinsUrl, {headers: this.getHeaders()})
.map(this.mapTokens);
get()本身返回可观察的。要从Observable中检索数据,可以对其使用subscribe()方法
不需要像在代码中那样在响应时调用map
返回response.json().map(this.toCoinMarketCapToken)
json()将为您提供一个Promise对象,而Promise对象没有map方法。必须调用then()方法从中检索数据
您混合了旧版本和新版本的编码风格。有几件事,你应该改变你的代码,
1.您应该使用HttpHeaders(可以从@angular/common/http导入)而不是headers。
2.不需要像在中那样在web服务响应时调用map
return this._http.get(coinMarketcapCoinsUrl, {headers: this.getHeaders()})
.map(this.mapTokens);
get()本身返回可观察的。要从Observable中检索数据,可以对其使用subscribe()方法
不需要像在代码中那样在响应时调用map
返回response.json().map(this.toCoinMarketCapToken)
json()将为您提供一个Promise对象,而Promise对象没有map方法。必须调用then()方法从中检索数据
下面的代码可以工作
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;
}
从“@angular/core”导入{Injectable};
从“rxjs”导入{Observable};
从'@angular/common/http'导入{HttpClient};
const coinMarketcapCoinsUrl=”https://s2.coinmarketcap.com/generated/search/quick_search.json";
@可注射()
导出类MarketDataService{
构造函数(私有的http:HttpClient){
}
getCoinMarketCapTokens():可观察{
返回此信息。_http.get(coinMarketcapCoinsUrl);
}
}
导出类CoinMarketCaptokenity{
名称
象征;
等级
鼻涕虫
代币;
身份证件
}
以下代码有效
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;
}
从“@angular/core”导入{Injectable};
从“rxjs”导入{Observable};
从'@angular/common/http'导入{HttpClient};
const coinMarketcapCoinsUrl=”https://s2.coinmarketcap.com/generated/search/quick_search.json";
@可注射()
导出类MarketDataService{
构造函数(私有的http:HttpClient){
}
getCoinMarketCapTokens():可观察{
返回此信息。_http.get(coinMarketcapCoinsUrl);
}
}
导出类CoinMarketCaptokenity{
名称
象征;
等级
鼻涕虫
代币;
身份证件
}
Sharemarket data.component.ts
,您可能已经为您添加的CoinMarketCaptokenity[]
resultI指定了可观察类型。我的缺点是,这个问题来自市场数据.component
我猜share市场数据.component.ts
,可能您已经为您添加的CoinMarketCaptokenty[]
结果分配了一个可观察类型。我的缺点是,问题来自市场数据。组件我想是的,我忽略了问题是从组件方面发生的这一事实。谢谢是的,我忽略了问题发生在组件方面的事实。谢谢哦,酷!我不知道这件事。网上有很多关于angular的例子,所以很难找到最新的。让我马上试试这个,你可以参考,它将帮助你处理从你的Web服务收到的数据。哦,酷!我不知道这件事。网上有很多关于angular的例子,所以很难找到最新的。让我马上试试这个,你可以参考,它将帮助你处理从你的Web服务接收到的数据。欢迎使用堆栈溢出!请不要把你的源代码扔在这里。要和蔼可亲,试着对你的答案做出一个很好的描述,这样别人就会喜欢你的答案