A propriedade 'map' não existe no tipo 'Observable <Response>'


Respostas:


371

Você precisa importar o mapoperador:

import 'rxjs/add/operator/map'

Ou mais geralmente:

import 'rxjs/Rx';

Aviso: Para versões do RxJS 6.x.xe versões posteriores , você precisará usar operadores pipeable, conforme mostrado no snippet de código abaixo:

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);
    });
  }
}

Isso é causado pela equipe do RxJS removendo o suporte ao uso. Veja as alterações mais recentes no log de alterações do RxJS para obter mais informações.

No changelog:

operadores : operadores Pipeable deve agora ser importados de rxjs assim: import { map, filter, switchMap } from 'rxjs/operators';. Nenhuma importação profunda.


Nome de módulo inválido em aumento, módulo '../../Observable' não pode ser encontrado. A propriedade 'map' não existe no tipo 'Observable <Response>'.
— Malik Kashmiri

Como você importa a Observableclasse? Assim: import {Observable} from 'rxjs/Observable';ou import {Observable} from 'rxjs/Rx';?
— Thierry Templier

não estou importando essa classe até agora #
— Malik Kashmiri 13/16

1
Estou usando Angular 2 RC1 e rxjs 5.0.0-beta2. Importei Observable como import {Observable} de 'rxjs / observable'; e operador de mapa importado, como import 'rxjs / add / operator / map'; Estava funcionando quando eu estava usando o Beta 7. Acabei de atualizar para o RC1 e ele quebrou.
— Darshan Puranik

4
Primeiro, escreva este comando no terminal vs code do seu projeto e reinicie o projeto. npm install rxjs-compat, do que importar o mapoperador.
— Karan Raiyani

162

Revisitando isso, porque minha solução não está listada aqui.

Estou executando o Angular 6 com rxjs 6.0 e me deparei com esse erro.

Aqui está o que eu fiz para corrigi-lo:

eu mudei

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

ser simplesmente:

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

Encontrei a correção aqui:

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


1
Não sei por que a ferramenta de migração rxjs-5-para-6-migrate não atende isso? É interessante que ele não lide com o re-mapeamento do / tap que, em meu ambiente, ainda não foi resolvido, embora a ferramenta de importação o reconheça. 90% do meu 'tempo desperdiçado imprevisto' no desenvolvimento Angular é gasto com problemas de limites de documentos e códigos RxJS, isso é realmente frustrante.
— 828 Joe

1
Obrigado! Você é um salva-vidas!! Quem estiver interessado, a referência completa para esta mudança está disponível aqui: github.com/ReactiveX/rxjs/blob/master/...
— malvadao

21
Isso funcionou para mim, eu também precisava para adicionarimport { map } from 'rxjs/operators';
— paul

Engraçado, foi exatamente assim que corrigimos a atualização angular 6 - que também trouxe os últimos rxjs.
— Max

2
@paul Obrigado. Em relação .catch, podemos usar catchErrorcomo .pipe(catchError(this.handleError))?
— FindOutIslamNow

60

basta escrever este comando no terminal vs code do seu projeto e reiniciar o projeto.

npm install rxjs-compat

Você precisa importar o mapoperador, escreva isto:

import 'rxjs/add/operator/map';

1
se não funcionar, feche todos os arquivos e reinicie o vs studio.
— Ajay Takur

1
Isso funcionou para mim, obrigado por compartilhar.
— thesamoanppprogrammer

30

Para o Angular 7v

mudança

import 'rxjs/add/operator/map';

Para

import { map } from "rxjs/operators"; 

E

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

ajudou-me @ Katana24 como eu vi a sintaxe correta com pipe.
— punkologist

25

Eu tive o mesmo problema com o Angular 2.0.1 porque estava importando o Observable de

import { Observable } from 'rxjs/Observable';

Em vez disso, resolvo meu problema ao importar o Observable desse caminho

import { Observable } from 'rxjs';

Essa prática é considerada não compatível com o tamanho do pacote, pois essa instrução importa todos os operadores Observable(incluindo os que você não usa) no pacote. Em vez disso, você deve importar cada operador individualmente. Eu recomendo o uso de "operadores permitidos", que foi introduzido no RxJS v5.5 para oferecer melhor agitação nas árvores.
— Sarun Intaralawan

15

No rxjs 6, o uso do operador do mapa foi alterado agora, você precisa usá-lo dessa maneira.

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

Para referência https://www.academind.com/learn/javascript/rxjs-6-what-changed/#operators-update-path


Observe esta resposta, pois qualquer pessoa que fizer RxJS v6isso precisará usar o .pipe()ou nenhum dos operadores trabalhará diretamente no Observable. Você verá um erro como,Property 'share' does not exist on type 'Observable<{}>'
— atconway

8

basta instalar o rxjs-compat digitando o terminal:

npm install --save rxjs-compat

depois importe:

import 'rxjs/Rx';

8

No mais recente Angular 7. *. * , Você pode tentar isso simplesmente como:

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

E então você pode usá-los da methodsseguinte maneira:

   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);
      })
    );
  }

Confira esta demonstração para mais detalhes.


5

No meu caso, não basta incluir apenas o mapa e a promessa:

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

Resolvi esse problema importando vários componentes rxjs, como recomenda a documentação oficial :

1) Importar instruções em um arquivo app / rxjs-operator.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) Importe o próprio operador rxjs no seu serviço:

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

Sinto que não é correto incluir operadores rxjs em todos os serviços. Deve ser incluído apenas com app.module.ts mas infelizmente ng teste lança erro se os operadores não são importados em lugares específicos
— Mohan Ram

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));
}

Na função acima, você pode ver que eu não usei res.json () desde que estou usando HttpClient. Aplica res.json () automaticamente e retorna Observable (HttpResponse <string>). Você não precisa mais chamar essa função depois do angular 4 no HttpClient.


3

Eu tive o mesmo problema, estava usando o Visual studio 2015, que tinha uma versão mais antiga do texto datilografado.

Após a atualização da extensão, o problema foi resolvido.

Link para Download


3

Estou usando o Angular 5.2 e, quando o uso import 'rxjs/Rx';, gera o seguinte erro de fiapo: TSLint: Esta importação está na lista negra, importe um submódulo (import-blacklist)

Veja a imagem abaixo: A importação de rxjs / Rx está na lista negra no Angular 5.2

SOLUÇÃO: Resolvi importando apenas os operadores que eu precisava . Exemplo a seguir:

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

Portanto, a correção seria importar especificamente apenas os operadores necessários.


@AndrewBenjamin Eu sugiro que você faça isso. Isso vai lhe poupar muitos problemas no caminho.
— Devner

3

Basta instalar o rxjs-compat para resolver o problema

npm i rxjs-compat --save-dev

E importe-o como abaixo

import 'rxjs/Rx';

3

Antes de tudo, execute a instalação como abaixo:

npm install --save rxjs-compat@6

Agora você precisa importar rxjsem service.ts:

import 'rxjs/Rx'; 

Voila! O problema foi corrigido.



2

Eu tentei todas as respostas possíveis postadas acima, nenhuma delas funcionou,

Eu o resolvi simplesmente reiniciando meu IDE, ou seja, código do Visual Studio

Que isso ajude alguém.


2

Eu também enfrentei o mesmo erro. Uma solução que funcionou para mim foi adicionar as seguintes linhas no seu arquivo service.ts em vez de import 'rxjs/add/operator/map':

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

Por exemplo, meu app.service.ts após a depuração era como,

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

Se depois de importar import 'rxjs / add / operator / map' ou importar 'rxjs / Rx' você também receber o mesmo erro e reiniciar o editor de código do visual studio, o erro será resolvido.


1

para todos os usuários linux que estão tendo esse problema, verifique se a pasta rxjs-compat está bloqueada. Eu tive exatamente o mesmo problema e entrei no terminal, usei o sudo su para dar permissão a toda a pasta rxjs-compat e foi corrigido. Isso supõe que você importou

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

no arquivo project.ts em que ocorreu o erro .map original.


1

Use a mapfunção em pipefunction e isso resolverá o seu problema. Você pode verificar a documentação aqui .

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());
  }

 }

execute o comando

 npm install rxjs-compat 

Eu apenas importo

 import 'rxjs/add/operator/map';

reinicie o código vs, problema resolvido.


-1

A nova versão angular não suporta .map, você precisa instalá-lo através do cmd npm install --save rxjs-compat através disso, você pode desfrutar com a técnica antiga. nota: não esqueça de importar essas linhas.

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

1
Essa resposta tardia é redundante.
— Tom Faltesek
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.