260 votes

La propriété 'map' n'existe pas sur le type 'Observable<Response>'.

J'essaie d'appeler une API depuis Angular mais j'obtiens cette erreur :

Property 'map' does not exist on type 'Observable<Response>'

Les réponses à cette question similaire n'ont pas résolu mon problème : Angular 2 beta.17 : La propriété 'map' n'existe pas sur le type 'Observable<Response>'. .

J'utilise Angular 2.0.0-beta.17.

460voto

thierry templier Points 998

Vous devez importer le map opérateur :

import 'rxjs/add/operator/map'

Ou plus généralement :

import 'rxjs/Rx';

Avis : Pour les versions de RxJS 6.x.x et plus, vous devrez utiliser les opérateurs pipeables comme indiqué dans le code ci-dessous :

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

Cela est dû au fait que l'équipe RxJS a supprimé la prise en charge de l'utilisation de la fonction Voir le les modifications de rupture dans le changelog de RxJS pour plus d'informations.

Extrait du journal des modifications :

opérateurs : Les opérateurs canalisables doivent maintenant être importés de rxjs comme ceci : import { map, filter, switchMap } from 'rxjs/operators'; . Pas d'importations profondes.

0 votes

Nom de module non valide dans l'augmentation, le module '../../Observable' est introuvable. La propriété 'map' n'existe pas sur le type 'Observable<Response>'.

0 votes

Comment importez-vous le Observable classe ? Comme ça : import {Observable} from 'rxjs/Observable'; ou import {Observable} from 'rxjs/Rx'; ?

0 votes

Je n'importe pas cette classe jusqu'à présent

198voto

Nick Hodges Points 10818

Je reviens sur cette question parce que ma solution ne figure pas dans cette liste.

J'utilise Angular 6 avec rxjs 6.0 et j'ai rencontré cette erreur.

Voici ce que j'ai fait pour le réparer :

J'ai changé

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

d'être simplement :

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

J'ai trouvé la solution ici :

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

2 votes

Je ne sais pas pourquoi l'outil de migration rxjs-5-to-6-migrate ne le détecte pas ? Il est intéressant de noter qu'il n'aborde pas le remappage do/tap qui, dans mon environnement, n'est toujours pas résolu, même si l'outil d'importation le reconnaît. 90% de mon "temps perdu imprévu" dans le développement d'Angular est consacré aux problèmes de documents RxJS et de limites de code, c'est vraiment frustrant.

1 votes

Merci ! Vous êtes un sauveur de vies ! Pour ceux qui sont intéressés, la référence complète de ce changement est disponible ici : github.com/ReactiveX/rxjs/blob/master/

32 votes

Cela a fonctionné pour moi, j'ai également dû ajouter import { map } from 'rxjs/operators';

72voto

Karan Raiyani Points 353

Il suffit d'écrire cette commande dans le terminal VS Code de votre projet et de redémarrer le projet.

npm install rxjs-compat

Vous devez importer le map en ajoutant ceci :

import 'rxjs/add/operator/map';

2 votes

Si cela ne fonctionne pas, fermez tous les fichiers et redémarrez le vs studio.

26voto

S.Galarneau Points 1171

J'ai eu le même problème avec Angular 2.0.1 parce que j'importais Observable à partir de

import { Observable } from 'rxjs/Observable';

Je résous mon problème en important l'Observable à partir de ce chemin à la place.

import { Observable } from 'rxjs';

1 votes

Cette pratique est considérée comme peu respectueuse de la taille de la liasse, car cette déclaration importe tous les opérateurs de l'option Observable (y compris ceux que vous n'utilisez pas) dans le paquet. Au lieu de cela, vous devez importer chaque opérateur individuellement. Je recommande d'utiliser les "opérateurs lettables", qui ont été introduits dans RxJS v5.5 pour mieux supporter le tree-shaking.

19voto

Dans rxjs 6, l'utilisation de l'opérateur de carte a été modifiée. maintenant vous devez l'utiliser comme ceci.

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

A titre de référence https://www.academind.com/learn/javascript/rxjs-6-what-changed/#operators-update-path

1 votes

Prenez note de cette réponse comme toute personne faisant RxJS v6 devra utiliser le .pipe() ou aucun des opérateurs ne fonctionnera directement à partir de l'Observable. Vous verrez une erreur comme, Property 'share' does not exist on type 'Observable<{}>'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X