2017-04-17 65 views
0

我正在尝试创建一个http请求并执行映射。map angular2:参数类型与参数不匹配

我遵循角度文档,但由于某种原因,我在地图函数:“参数类型不匹配参数”出错。请注意我已经输入'rxjs/add/operator/map';

我需要npm install什么吗?

我使用Angular 4.0.2rxjs 5.0.1WebStorm 2016.1.3这里是我的代码:

import { Injectable } from '@angular/core'; 
    import { Http, Response } from '@angular/http'; 
    import {Observable} from "rxjs/Observable"; 
    import 'rxjs/add/operator/catch'; 
    import 'rxjs/add/operator/map'; 

    @Injectable() 
    export class ApiService { 

     constructor(private http: Http) { 
     } 

     public getValue() : Observable<any> { 

     return this.http.get('') 
         .map(this.extractData) 
         .catch((error:any) => Observable.throw(error.json().error || 'Server error')); 

     } 

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

UPDATE:

因为某些原因:更改为.map().map(this.extractData)解决的问题。 这里是map.d.ts定义:

import { map } from '../../operator/map'; 
declare module '../../Observable' { 
    interface Observable<T> { 
     map: typeof map; 
    } 
} 

我会很高兴,如果有人能解释为什么。

更新2:

恢复到.map(this.extractData)没有.map()似乎正在运行的项目时,工作!可能是由webstorm IDE产生的错误。

+0

你的解决方案是一个糟糕的想法.... Typescript编译器错误通常是警告,你可能混合了你不明确混合的东西。你确定你的错误是与原始的'地图'功能?如果你删除了“地图”,错误消失了吗?或者如果您临时更改extractData函数以接受'any'作为其参数,那么Typescript错误消失了吗? – snorkpete

+0

@snorkpete如果我删除地图()然后我得到一个错误。此外,更改提取数据以接受“res:any”而不是“res:Response”仍然会产生相同的错误 – ohadinho

+0

当您删除'map'时,您是否得到相同(原始)错误或不同的错误? – snorkpete

回答

0

您确定错误在map声明?

IMO这一行:

return this.http.get('') 

会抛出,因为缺少URL('')的错误,这将是代替调用:

.catch((error:any) => Observable.throw(error.json().error || 'Server error')); 

如果是这样的问题,再查Observable.throw的签名,它期望作为第一个参数的异常。我觉得应该是:

.catch((error:any) => Observable.throw(new Error(error.json().error || 'Server error'))); 

我希望这有助于

+0

我得到的设计时间的错误..有一个编译错误.. – ohadinho

0

你不extractData提供任何输入参数。更改为.map((data) => this.extractData(data))或沿着该行。

+0

更改后我得到相同的错误 – ohadinho

+0

更改res:响应res:extractData上的任何内容,看看它是否有帮助。 – unitario

+0

仍然没有帮助。 – ohadinho