Angular 2 beta.17: la 'mappa' delle proprietà non esiste sul tipo 'Osservabile <Risposta>'


195

Ho appena aggiornato da Angular 2 beta16 a beta17 , che a sua volta richiede rxjs 5.0.0-beta.6. ( Elenco delle modifiche qui: https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta17-2016-04-28 ) In beta16 tutto funzionava bene per quanto riguarda la funzionalità osservabile / mappa. I seguenti errori sono comparsi dopo l'upgrade e si verificano quando i dattiloscritti tentano di trascrivere:

  1. La 'mappa' della proprietà non esiste sul tipo 'Osservabile' (ovunque in cui ho usato la mappa con un osservabile)
  2. c: /path/node_modules/rxjs/add/operator/map.d.ts (2,16): errore TS2435: i moduli ambientali non possono essere nidificati in altri moduli o spazi dei nomi.
  3. c: /path/node_modules/rxjs/add/operator/map.d.ts (2,16): errore TS2436: la dichiarazione del modulo ambientale non può specificare un nome modulo relativo.

Ho visto questa domanda / risposta ma non risolve il problema: errori osservabili con Angular2 beta.12 e RxJs 5 beta.3

Il mio appBoot.ts è simile a questo (sto già facendo riferimento a 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
]);

Qualcuno ha idea di cosa sta andando in tilt?


Il possibile duplicato della 'mappa'
polipo

Risposte:


284

Devi importare l' mapoperatore:

import 'rxjs/add/operator/map'

3
Il team Angular e il team RxJS NON raccomandano entrambi questo approccio di importazione dell'intera RX in questo modo. Non dovresti farlo. È troppo grande. La prima risposta sopra va bene, ma la seconda, non tanto. @ 0x1ad2 puoi aggiornare la tua risposta per non includere quella massiccia importazione come seconda opzione?
gelido

2
Questo non è intuitivo. Dove è documentato come dipendenza dall'implementazione di Observable in uno sviluppo Angular 2+?
Joe,

È applicabile a ionico 3.20.0? Ho avuto lo stesso problema perché ionico non ha importato automaticamente la mappa. L'importazione funziona in modo esplicito ma non sono sicuro che sia corretto.
LordDraagon,

1
questo non risolve il problema per molti per me ho dovuto usare Pipe invece di rxjs / add / operator / map Ho usato rxjs / operatori import con pipe e .pipe (map (res => res.json ()));
codefreaK

Sono arrivato qui dopo alcune ricerche su Google in un momento in cui ora stiamo usando Angular 7 e RXJS ha subito alcune modifiche. Il nuovo metodo è import { map } from 'rxjs/operators', ma un'altra risposta ha più dettagli.
Colby Hunter,

78

Ho aggiornato il mio plugin gulp-typescript all'ultima versione (2.13.0) e ora si compila senza intoppi.

AGGIORNAMENTO 1: In precedenza utilizzavo gulp-typescript versione 2.12.0

AGGIORNAMENTO 2: se si sta eseguendo l'aggiornamento a Angular 2.0.0-rc.1, è necessario effettuare le seguenti operazioni nel file 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'importante è il riferimento a es6-shim / index.d.ts

Questo presuppone che tu abbia installato le tipizzazioni es6-shim come mostrato qui: inserisci qui la descrizione dell'immagine

Maggiori informazioni sull'installazione delle tipizzazioni da Angular qui: https://angular.io/docs/ts/latest/guide/typescript-configuration.html#!#typings


Puoi per favore menzionare il vecchio numero di versione che aveva il problema? Grazie.
Meligy,

1
@Meligy In precedenza utilizzavo gulp-typescript versione 2.12.0
brando

1
Eccezionale. Ho aggiornato il mio articolo sul mapmessaggio di errore per includere una nota per gli utenti con problemi simili. Grazie mille :)
Meligy

1
@Meligy Ho avuto di nuovo lo stesso problema quando ho effettuato l'aggiornamento ad Angular2 RC. Ho aggiornato la mia risposta sopra per mostrare come l'ho risolto.
brando

6
import 'rxjs/Rx'; // Carica tutte le funzionalità
VahidN,

67

Rxjs 5.5 "Proprietà" mappa "non esiste sul tipo Osservabile.

Il problema era legato al fatto che è necessario aggiungere pipe attorno a tutti gli operatori.

Cambia questo,

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

a questa

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

E

Importa mappa in questo modo,

import { map } from 'rxjs/operators';

Risolverà i tuoi problemi.


3
Questo vale anche per Rxjs 6. Ogni tutorial che guardo, hanno la funzione di mappa senza pipe. Questo non ha funzionato per me fino a quando non ho aggiunto pipe e importato la mappa da "rxjs / operatori" esattamente come afferma la risposta.
Keyvan Sadralodabai,

Sì, si applica anche a Rxjs 6.
Hiran DA Walawage

41

Nel mio caso non sarebbe sufficiente includere solo la mappa e la promessa:

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

Ho risolto questo problema importando diversi componenti rxjs come raccomandato dalla documentazione ufficiale :

1) Importare le istruzioni in un file app / rxjs-operatori.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) Importa rxjs-operator stesso nel tuo servizio:

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

Ancora una volta, la migliore risposta alla domanda non ha il maggior numero di voti. Questa è la risposta migliore per questa domanda. Grazie per aver condiviso. Vorrei che altri lo votassero.
gelido,

26

Se ti capita di vedere questo errore in VS2015, c'è un problema github e soluzione alternativa menzionato qui:

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

Questo mi ha aiutato a risolvere il property map does not exist on observableproblema. Inoltre, assicurati di avere la versione dattiloscritta sopra 1.8.2


8
Sostituzione C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TypeScript\typescriptServices.js con typescriptService ha funzionato per VS 15. ( riavvia vs dopo aver sostituito il file )
tchelidze,

la sostituzione del file sopra menzionato ha funzionato anche per me
Krishnan,

Ancora nessun aggiornamento da parte di Microsoft ... Perché non lo stanno risolvendo?
Piotrek,

26

LA RISPOSTA FINALE PER CHI UTILIZZA IL 6 ANGOLARE:

Aggiungi il comando seguente nel file * .service.ts "

import { map } from "rxjs/operators";

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

Sto usando Windows 10;

angular6 con dattiloscritto V 2.3.4.0


Sembra che non possiamo più semplicemente importarlo in app.module.ts. Ora dobbiamo importarlo in ogni servizio e componente
Adam Mendoza,

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

&

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

ha funzionato per me


13

In 2x angolare

In example.component.ts

import { Observable } from 'rxjs';

In example.component.html

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

In Angolare 5x o Angolare 6x:

In example.component.ts

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

In example.component.html

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

1
perché dobbiamo usare pipe invece mappare direttamente?
Krish,

10

AGGIORNAMENTO 29 settembre 2016 per Angular 2.0 Final e VS 2015

La soluzione alternativa non è più necessaria, per risolvere è sufficiente installare TypeScript versione 2.0.3 .

Risolto il problema tratto dalla modifica di questo commento sulla questione github .


3
Ho questo problema, ho installato anche la 2.0.3: /
Mild Fuzz

1
ho TS 2.1.6 ma continuo a vedere il problema
alltej

Al momento di questo commento, TS più recente è 2.5.2. Questa versione si sta rompendo per me. Utilizzando 2.3.x funziona.
PigBoT,

10

A quanto ho capito, è a causa rxjsdell'ultimo aggiornamento. Hanno cambiato alcuni operatori e sintassi. Successivamente dovremmo importare rxoperatori come questo

import { map } from "rxjs/operators";

Invece di questo

import 'rxjs/add/operator/map';

E dobbiamo aggiungere pipe attorno a tutti gli operatori come questo

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

La fonte è qui


9

Come ha suggerito Justin Scofield nella sua risposta, per l'ultima versione di Angular 5 e per Angular 6, come il 1 ° giugno 2018, import 'rxjs/add/operator/map';non è sufficiente rimuovere l'errore TS: [ts] Property 'map' does not exist on type 'Observable<Object>'.

È necessario eseguire il comando seguente per installare le dipendenze richieste: npm install rxjs@6 rxjs-compat@6 --savedopo di che mapviene risolto l'errore di dipendenza dall'importazione!


1
Sembra che si
verifichino

8

Stavo affrontando l'errore simile. È stato risolto quando ho fatto queste tre cose:

  1. Aggiornamento agli ultimi rxjs:

    npm install rxjs@6 rxjs-compat@6 --save
  2. Importa mappa e promessa:

    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/toPromise';
  3. Aggiunta una nuova dichiarazione di importazione:

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

7

Sembra che l'ultimo RxJS richieda il dattiloscritto 1.8, quindi il dattiloscritto 1.7 riporta l'errore sopra riportato.

Ho risolto questo problema aggiornando all'ultima versione dattiloscritta.


Se si utilizza tscdal comando controllare tsc -v;-) L'utilizzo di "script" è ancora migliore idea, vedi stackoverflow.com/a/37034227/478584
tomaszbak

6

Messaggi di errore simili verranno visualizzati quando si passa dalla versione 5 alla 6. Ecco una risposta per la modifica a rxjs-6.

Importa i singoli operatori, quindi usa pipeinvece di concatenare.

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

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

6

Se stai usando angular4, usa l'importazione sotto. dovrebbe funzionare .

import 'rxjs / add / operator / map';

Se si utilizza angular5 / 6, utilizzare la mappa con pipe e importare al di sotto di uno

importare {map} da "rxjs / operatori";


1

la proprietà 'map' non esiste sul tipo 'risposta osservabile' angolare 6

Soluzione: aggiornare la CLI angolare e la versione 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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.