Angular 2 beta.17: La propriété 'map' n'existe pas sur le type 'Observable <Response>'


195

Je viens de passer d'Angular 2 beta16 à beta17 , qui à son tour nécessite rxjs 5.0.0-beta.6. (Changelog ici: https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta17-2016-04-28 ) En beta16 tout fonctionnait bien en ce qui concerne la fonctionnalité Observable / map. Les erreurs suivantes sont apparues après la mise à niveau et se produisent lorsque des tentatives de transcription sont dactylographiées:

  1. La propriété 'map' n'existe pas sur le type 'Observable' (partout où j'ai utilisé map avec un observable)
  2. c: /path/node_modules/rxjs/add/operator/map.d.ts (2,16): erreur TS2435: les modules ambiants ne peuvent pas être imbriqués dans d'autres modules ou espaces de noms.
  3. c: /path/node_modules/rxjs/add/operator/map.d.ts (2,16): erreur TS2436: la déclaration du module ambiant ne peut pas spécifier un nom de module relatif.

J'ai vu cette question / réponse mais cela ne résout pas le problème: Erreurs observables avec Angular2 beta.12 et RxJs 5 beta.3

Mon appBoot.ts ressemble à ceci (je fais déjà référence à rxjs / map):

///<reference path="./../node_modules/angular2/typings/browser.d.ts"/>
import {bootstrap} from "angular2/platform/browser";
import {ROUTER_PROVIDERS} from 'angular2/router';
import {HTTP_PROVIDERS} from 'angular2/http';
[stuff]
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
import {enableProdMode} from 'angular2/core';
import { Title } from 'angular2/platform/browser';


//enableProdMode();
bootstrap(AppDesktopComponent, [
    ROUTER_PROVIDERS,
    HTTP_PROVIDERS,
    Title
]);

Quelqu'un at-il une idée de ce qui se passe mal?


Réponses:


284

Vous devez importer l' mapopérateur:

import 'rxjs/add/operator/map'

3
L'équipe Angular et l'équipe RxJS NE recommandent PAS cette approche d'importer l'intégralité du RX comme ceci. Tu ne devrais pas faire ça. C'est trop grand. La première réponse ci-dessus est très bien, mais la deuxième, pas tellement. @ 0x1ad2 pouvez-vous mettre à jour votre réponse pour ne pas inclure cette importation massive comme deuxième option?
2017 givré

2
Ce n'est pas intuitif. Où cela est-il documenté comme une dépendance à la mise en œuvre d'Observable dans un développement Angular 2+?
Joe

Est-ce applicable à ionique 3.20.0? J'ai eu le même problème car ionic n'a pas importé automatiquement la carte. L'importation fonctionne explicitement mais je ne suis pas sûr que ce soit correct.
LordDraagon

1
cela ne résout pas le problème pour beaucoup pour moi, j'ai dû utiliser Pipe to au lieu de rxjs / add / operator / map J'ai utilisé rxjs / operators import avec pipe et .pipe (map (res => res.json ()));
codefreaK

Je suis arrivé ici après quelques recherches sur Google à une époque où nous utilisons maintenant Angular 7 et RXJS a subi quelques changements. La nouvelle méthode est import { map } from 'rxjs/operators', mais une autre réponse a plus de détails.
Colby Hunter

78

J'ai mis à jour mon plugin gulp-typescript vers la dernière version (2.13.0) et maintenant il compile sans accroc.

MISE À JOUR 1: J'utilisais auparavant la version 2.12.0 de gulp-typescript

MISE À JOUR 2: Si vous effectuez une mise à niveau vers Angular 2.0.0-rc.1, vous devez effectuer les opérations suivantes dans votre fichier appBoot.ts:

///<reference path="./../typings/browser/ambient/es6-shim/index.d.ts"/>
import { bootstrap } from "@angular/platform-browser-dynamic";
import { ROUTER_PROVIDERS } from '@angular/router-deprecated';
import { HTTP_PROVIDERS } from '@angular/http';
import { AppComponent } from "./path/AppComponent";
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
// import 'rxjs/Rx'; this will load all features
import { enableProdMode } from '@angular/core';
import { Title } from '@angular/platform-browser';



//enableProdMode();
bootstrap(AppComponent, [
    ROUTER_PROVIDERS,
    HTTP_PROVIDERS,
    Title
]);

L'important étant la référence à es6-shim / index.d.ts

Cela suppose que vous avez installé les typages es6-shim comme indiqué ici: entrez la description de l'image ici

Plus d'informations sur les typages installés à partir d'Angular ici: https://angular.io/docs/ts/latest/guide/typescript-configuration.html#!#typings


Pouvez-vous s'il vous plaît mentionner l'ancien numéro de version à l'origine du problème? Merci.
Meligy

1
@Meligy J'utilisais auparavant la version 2.12.0 de
gulp

1
Impressionnant. J'ai mis à jour mon article sur le mapmessage d'erreur pour inclure une note pour les utilisateurs ayant des problèmes similaires. Merci beaucoup :)
Meligy

1
@Meligy J'ai eu à nouveau ce même problème lors de la mise à niveau vers l'Angular2 RC. J'ai mis à jour ma réponse ci-dessus pour montrer comment je l'ai résolue.
brando

6
import 'rxjs/Rx'; // Charge toutes les fonctionnalités
VahidN

67

Rxjs 5.5 «La propriété 'map' n'existe pas sur le type Observable.

Le problème était lié au fait que vous devez ajouter un tuyau autour de tous les opérateurs.

Change ça,

this.myObservable().map(data => {})

pour ça

this.myObservable().pipe(map(data => {}))

Et

Importez une carte comme celle-ci,

import { map } from 'rxjs/operators';

Cela résoudra vos problèmes.


3
Cela s'applique également à Rxjs 6. Chaque tutoriel que je regarde, ils ont la fonction map sans pipe. Cela n'a pas fonctionné pour moi jusqu'à ce que j'ajoute un tuyau et que j'importe la carte de «rxjs / operators» exactement comme l'indique la réponse.
Keyvan Sadralodabai

Oui, cela s'applique également à Rxjs 6.
Hiran DA Walawage

41

Dans mon cas, il ne suffirait pas d'inclure uniquement la carte et la promesse:

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

J'ai résolu ce problème en important plusieurs composants rxjs comme le recommande la documentation officielle :

1) Importez des instructions dans un fichier 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) Importez rxjs-operator lui-même dans votre service:

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

Encore une fois, la meilleure réponse à la question n'a pas le plus de votes. C'est la meilleure réponse à cette question. Merci pour le partage. Je souhaite que d'autres votent cela.
2017 givré

26

Si vous rencontrez cette erreur dans VS2015, il y a un problème de github et une solution de contournement mentionnés ici:

https://github.com/Microsoft/TypeScript/issues/8518#issuecomment-229506507

Cela m'a aidé à résoudre le property map does not exist on observableproblème. De plus, assurez-vous d'avoir une version dactylographiée supérieure à 1.8.2


8
Le remplacement C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TypeScript\typescriptServices.js par typescriptService a fonctionné pour VS 15. ( redémarrage vs après remplacement du fichier )
tchelidze

le remplacement du fichier mentionné ci-dessus a également fonctionné pour moi
Krishnan

Toujours pas de mise à jour de Microsoft ... Pourquoi ne le réparent-ils pas?
Piotrek

26

LA RÉPONSE FINALE POUR CEUX QUI UTILISENT L'ANGULAIRE 6:

Ajoutez la commande ci-dessous dans votre fichier * .service.ts "

import { map } from "rxjs/operators";

**********************************************Example**Below**************************************
getPosts(){
this.http.get('http://jsonplaceholder.typicode.com/posts')
.pipe(map(res => res.json()));
}
}

J'utilise Windows 10;

angular6 avec dactylographié V 2.3.4.0


Il semble que nous ne pouvons plus simplement l'importer dans app.module.ts. Maintenant, nous devons l'importer dans chaque service et composant
Adam Mendoza

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

&

npm install rxjs@6 rxjs-compat@6 --save

travaillé pour moi


13

En angulaire 2x

Dans example.component.ts

import { Observable } from 'rxjs';

Dans example.component.html

  Observable.interval(2000).map(valor => 'Async value');

En angulaire 5x ou angulaire 6x:

Dans example.component.ts

import { Observable, interval, pipe } from 'rxjs';
import {switchMap, map} from 'rxjs/operators';

Dans example.component.html

valorAsync = interval(2500).pipe(map(valor => 'Async value'));

1
pourquoi nous devons utiliser la pipe au lieu de la carte directement?
Krish

10

MISE À JOUR 29 septembre 2016 pour Angular 2.0 Final et VS 2015

La solution de contournement n'est plus nécessaire, pour résoudre ce problème, il vous suffit d' installer TypeScript version 2.0.3 .

Correction tirée de l'édition sur ce commentaire de problème github .


3
J'ai ce problème, j'ai également installé 2.0.3: /
Mild Fuzz

1
j'ai TS 2.1.6 mais je vois toujours le problème
alltej

Au moment de ce commentaire, TS le plus récent est 2.5.2. Cette version se brise pour moi. L'utilisation de 2.3.x fonctionne.
PigBoT

10

Si je comprends bien, c'est à cause de la rxjsdernière mise à jour. Ils ont changé certains opérateurs et syntaxe. Par la suite, nous devrions importer des rxopérateurs comme celui-ci

import { map } from "rxjs/operators";

au lieu de cela

import 'rxjs/add/operator/map';

Et nous devons ajouter un tuyau autour de tous les opérateurs comme celui-ci

this.myObservable().pipe(map(data => {}))

La source est ici


9

Comme Justin Scofield l'a suggéré dans sa réponse, pour la dernière version d'Angular 5 et pour Angular 6, comme le 1er juin 2018, juste import 'rxjs/add/operator/map'; n'est pas suffisant pour supprimer l'erreur TS: [ts] Property 'map' does not exist on type 'Observable<Object>'.

Il est nécessaire d'exécuter la commande ci-dessous pour installer les dépendances requises: npm install rxjs@6 rxjs-compat@6 --saveaprès quoi l' maperreur de dépendance d'importation est résolue!


1
On dirait plus de changements de rupture, ce qui est inquiétant
Noobie3001

8

J'étais confronté à une erreur similaire. Cela a été résolu lorsque j'ai fait ces trois choses:

  1. Mise à jour vers les derniers rxjs:

    npm install rxjs@6 rxjs-compat@6 --save
  2. Importer la carte et la promesse:

    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/toPromise';
  3. Ajout d'une nouvelle instruction d'importation:

    import { Observable, Subject, asapScheduler, pipe, of, from, interval, merge, fromEvent } from 'rxjs';

7

Il semble que la dernière version de RxJS nécessite le typage 1.8, donc le typage 1.7 signale l'erreur ci-dessus.

J'ai résolu ce problème en passant à la dernière version dactylographiée.


Si vous utilisez la tsccommande from, veuillez vérifier tsc -v;-) L'utilisation de "scripts" est une meilleure idée, voir stackoverflow.com/a/37034227/478584
tomaszbak

6

Des messages d'erreur similaires apparaîtront lors de la transition de la version 5 à 6. Voici une réponse pour le changement vers rxjs-6.

Importez les opérateurs individuels, puis utilisez pipeau lieu de chaîner.

import { map, delay, catchError } from 'rxjs/operators'; 

source.pipe(
  map(x => x + x),
  delay(4000),
  catchError(err => of('error found')),
).subscribe(printResult);

6

Si vous utilisez angular4, utilisez ci-dessous l'importation. ça devrait marcher.

importer 'rxjs / add / operator / map';

Si vous utilisez angular5 / 6, utilisez map with pipe et importez en dessous de un

importer {map} depuis "rxjs / operators";


1

la propriété 'map' n'existe pas sur le type 'response observable' angular 6

Solution: mettre à jour la CLI angulaire et la version principale

ng update @angular/cli           //Update Angular CLi 
ng update @angular/core          //Update Angular Core 
npm install --save rxjs-compat   //For Map Call For Post Method 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.