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.