类型“ Observable <Response>”上不存在属性“ map”


Answers:


371

您需要导入map运算符:

import 'rxjs/add/operator/map'

或更笼统地说:

import 'rxjs/Rx';

注意:对于RxJS 6.x.x及更高版本,您将必须使用可管道运算符,如下面的代码片段所示:

import { map } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';

// ...
export class MyComponent {
  constructor(private http: HttpClient) { }
  getItems() {
    this.http.get('https://example.com/api/items').pipe(map(data => {})).subscribe(result => {
      console.log(result);
    });
  }
}

这是由于RxJS团队取消了对使用的支持。有关更多信息,请参见RxJS更改日志中的重大更改

从变更日志:

运算符:现在必须从rxjs导入可管道运算符,如下所示:import { map, filter, switchMap } from 'rxjs/operators';。没有深度进口。


扩充中无效的模块名称,找不到模块“ ../../Observable”。类型“ Observable <Response>”上不存在属性“ map”。
马利克·克什米尔

您如何导入Observable课程?像这样:import {Observable} from 'rxjs/Observable';还是import {Observable} from 'rxjs/Rx';
Thierry Templier

到目前为止,我还没有这个班级的学生
马利克·克什米尔

1
我正在使用Angular 2 RC1和rxjs 5.0.0-beta2。我已经从'rxjs / observable'导入了Observable作为导入{Observable}; 和导入的地图运算符,例如import'rxjs / add / operator / map'; 当我使用Beta 7时,它可以正常工作。我刚升级到RC1,它坏了。
达尔山·普拉尼克

4
首先在您的项目的vs代码终端中编写此命令,然后重新启动项目。npm install rxjs-compat,而不是导入map运算符。
卡兰·赖亚尼

162

再来一遍,因为这里没有列出我的解决方案。

我使用rxjs 6.0运行Angular 6并遇到此错误。

这是我修复它的方法:

我变了

map((response: any) => response.json())

简单地是:

.pipe(map((response: any) => response.json()));

我在这里找到了解决方法:

https://github.com/angular/angular/issues/15548#issuecomment-387009186


1
我不确定为什么迁移工具rxjs-5-to-6-migrate不能做到这一点?有趣的是,即使导入工具可以识别,它也无法解决在我的环境中仍然无法解决的do / tap重映射问题。我在Angular开发中90%的“意外浪费时间”都花在RxJS文档和代码边界问题上,这真令人沮丧。

1
谢谢!你是救星!无论谁感兴趣,都可以在此处找到有关此更改的完整参考:github.com/ReactiveX/rxjs/blob/master/…–
malvadao

21
这为我工作,我还需要添加import { map } from 'rxjs/operators';
保罗

有趣的是,这正是我们将其固定在angular 6升级上的方式-它也带来了最新的rxjs。
最多

2
@paul谢谢。关于.catch,我们可以使用catchError.pipe(catchError(this.handleError))
FindOutIslamNow18年

60

只需在您的项目的vs代码终端中编写此命令,然后重新启动项目即可。

npm install rxjs-compat

您需要map通过写入以下内容来导入运算符:

import 'rxjs/add/operator/map';

1
如果不起作用,请关闭所有文件,然后重新启动vs Studio。
Ajay Takur

1
这对我有用,谢谢分享。
thesamoanppprogrammer

30

对于Angular 7v

更改

import 'rxjs/add/operator/map';

import { map } from "rxjs/operators"; 

 return this.http.get('http://localhost/ionicapis/public/api/products')
 .pipe(map(res => res.json()));

它帮助了我@ Katana24,因为我看到了管道的正确语法。
朋克学家

25

我在Angular 2.0.1中遇到了相同的问题,因为我从中导入了Observable

import { Observable } from 'rxjs/Observable';

我解决了从此路径导入Observable的问题

import { Observable } from 'rxjs';

这种做法被认为是不适合束大小的,因为该语句会将所有运算符Observable(包括您不使用的运算符)导入束中。相反,您应该分别导入每个运算符。我建议使用RxJS v5.5中引入的“ lettable运算符”,以支持更好的摇树。
Sarun Intaralawan

15

在rxjs 6中,地图运算符的用法已更改,现在您需要像这样使用它。

import { map } from 'rxjs/operators';
myObservable
  .pipe(map(data => data * 2))
  .subscribe(...);

供参考 https://www.academind.com/learn/javascript/rxjs-6-what-c​​hanged/#operators-update-path


注意此答案,因为任何人RxJS v6都需要使用,.pipe()否则任何一个运算符都不会直接在Observable上工作。您会看到类似的错误,Property 'share' does not exist on type 'Observable<{}>'
atconway

8

只需通过输入终端安装rxjs-compat:

npm install --save rxjs-compat

然后导入:

import 'rxjs/Rx';

7

在最新的Angular 7。*。*中,您可以尝试以下操作:

import { Observable, of } from "rxjs";
import { map, catchError } from "rxjs/operators";

然后,您可以methods按以下方式使用它们:

   private getHtml(): Observable<any> {
    return this.http.get("../../assets/test-data/preview.html").pipe(
      map((res: any) => res.json()),
      catchError(<T>(error: any, result?: T) => {
        console.log(error);
        return of(result as T);
      })
    );
  }

查看此演示以获取更多详细信息。


5

就我而言,仅包含map和promise是不够的:

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';

我通过导入几个rxjs组件(按照官方文档的建议)解决了这个问题:

1)在一个app / rxjs-operators.ts文件中导入语句:

// import 'rxjs/Rx'; // adds ALL RxJS statics & operators to Observable

// See node_module/rxjs/Rxjs.js
// Import just the rxjs statics and operators we need for THIS app.

// Statics
import 'rxjs/add/observable/throw';

// Operators
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/toPromise';

2)在服务中导入rxjs-operator本身:

// Add the RxJS Observable operators we need in this app.
import './rxjs-operators';

我觉得在每个服务中都包含rxjs-operator是不合适的。应该只包括在app.module.ts可惜纳克如果运营商没有在特定的地方进口的测试抛出错误
磨憨拉姆

5
import { map } from "rxjs/operators";

getGetFunction(){
this.http.get('http://someapi')
.pipe(map(res => res));
}

getPostFunction(yourPara){
this.http.get('http://someapi',yourPara)
.pipe(map(res => res));
}

在上面的函数中,您可以看到我没有使用res.json(),因为我使用的是HttpClient。它会自动应用res.json()并返回Observable(HttpResponse <string>)。在HttpClient中的angular 4之后,您不再需要自己调用此函数。


3

我遇到了同样的问题,当时我使用的Visual Studio 2015的打字稿版本较旧。

升级扩展程序后,问题得到解决。

下载链接


3

我正在使用Angular 5.2,当我使用Angular 5.2时,import 'rxjs/Rx';它引发以下lint错误: TSLint:此导入已列入黑名单,请改为导入子模块(import-blacklist)

请参见下面的屏幕截图: 在Angular 5.2中将导入rxjs / Rx列入黑名单

解决方案: 通过仅导入所需的运算符来解决此问题。示例如下:

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

因此,解决方法是只导入必要的运算符。


@AndrewBenjamin我强烈建议您这样做。这样可以为您省去很多麻烦。
Devner '18




2

我尝试了上面所有可能的答案,但没有一个起作用,

我只需重新启动IDE(即Visual Studio Code)即可解决此问题

愿它对某人有帮助。


2

我也面临着同样的错误。为我工作的一个解决方案是添加在你的下面几行service.ts文件代替import 'rxjs/add/operator/map'

import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

例如,调试后我的app.service.ts就像

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class AppService {
    constructor(private http: HttpClient) {}
    getData(): Observable<any> {
        return this.http.get('https://samples.openweathermap.org/data/2.5/history/city?q=Warren,OH&appid=b6907d289e10d714a6e88b30761fae22')
        .pipe(map(result => result));
    }
}

2

如果在导入导入'rxjs / add / operator / map'或导入'rxjs / Rx'之后也遇到相同的错误,然后重新启动Visual Studio代码编辑器,该错误将得到解决。


1

对于所有遇到此问题的Linux用户,请检查rxjs-compat文件夹是否已锁定。我遇到了完全相同的问题,然后进入终端,使用sudo su授予整个rxjs-compat文件夹的权限,此问题已修复。假设您导入了

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch'; 

在发生原始.map错误的project.ts文件中。


1

mapfunction中使用pipefunction,它将解决您的问题。您可以在此处查看文档。

this.items = this.afs.collection('blalal').snapshotChanges().pipe(map(changes => {
  return changes.map(a => {
    const data = a.payload.doc.data() as Items;
    data.id = a.payload.doc.id;
    return data;
  })
})


0
  import { Injectable } from '@angular/core';
  import { Http } from '@angular/http';
  import 'rxjs/add/operator/map';

  @Injectable({
  providedIn: 'root'
  })
  export class RestfulService {

  constructor(public http: Http) { }

 //access apis Get Request 
 getUsers() {
 return this.http.get('http://jsonplaceholder.typicode.com/users')
  .map(res => res.json());
  }

 }

运行命令

 npm install rxjs-compat 

我只是进口

 import 'rxjs/add/operator/map';

重新启动vs代码,问题已解决。


-1

Angular新版本不支持.map,您必须通过cmd npm install --save rxjs-compat来安装。注意:不要忘记导入这些行。

import { Observable, Subject } from 'rxjs';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

1
这个迟来的答案是多余的。
汤姆·法尔特塞克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.