Angular 2:'Observable <response>'类型中不存在属性'map'

时间:2018-05-26 14:42:03

标签: angular

我在收到请求时遇到以下错误。

  

模块“'node_modules / rxjs / Observable”'没有导出成员'Observable'。   “Observable”类型中不存在属性“map”。

我已尝试过在StackOverflow中提供的所有可能的解决方案,但它对我不起作用。

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

    @Injectable()
    export class EmployeeService {
        private  _url : string = 'apiData/employeedata.json'
        constructor(private _http: Http) { }
        getEmployees(): Observable<IEmployee[]> {

            return this._http.get(this._url)
                .map((response: Response) => <IEmployee[]>response.json());
        }
    }

1 个答案:

答案 0 :(得分:2)

您正在使用 Angular 6 而不是Angular 2 您使用已弃用的HttpModule ,您应使用 HttpClientModule 代替 在新的HttpClientModule中,JSON是假设的默认值,不再需要使用res.json()来明确解析 在使用HttpClient之前,您需要将Angular HttpClientModule导入根模块。

    import { NgModule }         from '@angular/core';
    import { BrowserModule }    from '@angular/platform-browser';
    import { HttpClientModule } from '@angular/common/http';

    @NgModule({
      imports: [
        BrowserModule,
        HttpClientModule,
      ],
//.......

您可以告诉HttpClient响应的类型,使输出更容易,更明显。

可以使用类型参数

完成响应的类型检查

Http返回observable我们可以告诉HttpClient.getresponse作为IEmployee类型返回当我们使用http.get<IEmployee[]>(...)时,它会返回{的实例{1}}类型。

在您的组件Observable<IEmployee[]>subscribe中获取IEmployee的实例

在您的服务中

Observable<IEmployee[]>

除此之外,RxJS v5.5.2 +已移至 Pipeable operators 以改善树木抖动并更轻松地创建自定义运算符

新导入

import { Injectable } from '@angular/core';
    import { IEmployee } from './employee';
    import { HttpClient} from '@angular/common/http';
    import { Observable } from 'rxjs/Observable';


    @Injectable()
    export class EmployeeService {
        private  _url : string = 'apiData/employeedata.json'
        constructor(private _http: HttpClient) { }
        getEmployees(): Observable<IEmployee[]> {

            return this._http.get<IEmployee[]>(this._url);

        }
    }

并更改import { map} from 'rxjs/operators';
PS:如果您使用的是.map(...) to .pipe(map(..)) ,则不需要  修改后的代码

HttpClientModule

我建议您停止使用 return this._http.get(this._url).pipe( map((response: Response) => <IEmployee[]>response.json())); 并转到HttpModule而不是