Angular 2 beta.17: Properti 'peta' tidak ada pada tipe 'Observable <Response>'

195

Saya baru saja memutakhirkan dari Angular 2 beta16 ke beta17 , yang pada gilirannya membutuhkan rxjs 5.0.0-beta.6. (Changelog di sini: https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta17-2016-04-28 ) Pada beta16 semua bekerja dengan baik terkait fungsionalitas Observable / map. Kesalahan berikut ini muncul setelah saya memutakhirkan dan terjadi ketika naskah mencoba untuk mengubah:

  1. Properti 'peta' tidak ada pada tipe 'Dapat Diamati' (di mana pun saya menggunakan peta dengan yang dapat diamati)
  2. c: /path/node_modules/rxjs/add/operator/map.d.ts (2,16): kesalahan TS2435: Modul ambient tidak dapat bersarang di modul lain atau ruang nama.
  3. c: /path/node_modules/rxjs/add/operator/map.d.ts (2,16): error TS2436: Deklarasi modul ambient tidak dapat menentukan nama modul relatif.

Saya telah melihat pertanyaan / jawaban ini tetapi tidak menyelesaikan masalah: Kesalahan yang dapat diamati dengan Angular2 beta.12 dan RxJs 5 beta.3

AppBoot.ts saya terlihat seperti ini (saya sudah mereferensikan rxjs / peta):

///<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
]);

Adakah yang tahu apa yang terjadi?

brando
sumber

Jawaban:

284

Anda perlu mengimpor mapoperator:

import 'rxjs/add/operator/map'
0x1ad2
sumber
3
Tim Angular dan tim RxJS keduanya TIDAK merekomendasikan pendekatan ini untuk mengimpor seluruh RX seperti ini. Anda seharusnya tidak melakukan itu. Itu terlalu besar. Jawaban pertama di atas baik-baik saja, tetapi yang kedua, tidak terlalu banyak. @ 0x1ad2 dapatkah Anda memperbarui jawaban Anda untuk tidak memasukkan impor besar-besaran itu sebagai opsi kedua?
sangat dingin
2
Ini tidak intuitif. Di mana ini didokumentasikan sebagai ketergantungan untuk mengimplementasikan Observable dalam pengembangan Angular 2+?
Joe
Apakah ini berlaku untuk ionik 3.20.0? Saya mendapat masalah yang sama karena ionic tidak secara otomatis mengimpor peta. Mengimpor secara eksplisit berfungsi tetapi saya tidak yakin ini benar.
LordDraagon
1
ini tidak memperbaiki masalah bagi banyak bagi saya, saya harus menggunakan Pipa untuk bukannya rxjs / add / operator / peta saya menggunakan rxjs / operator impor dengan pipa dan .pipe (peta (res => res.json ()));
codefreaK
Saya tiba di sini setelah beberapa pencarian Google di saat kita menggunakan Angular 7 dan RXJS telah melalui beberapa perubahan. Metode baru import { map } from 'rxjs/operators', tetapi jawaban lain memiliki lebih banyak detail.
Colby Hunter
78

Saya memutakhirkan plugin gulp-typescript saya ke versi terbaru (2.13.0) dan sekarang kompilasi tanpa hambatan.

UPDATE 1: Saya sebelumnya menggunakan gulp-typescript versi 2.12.0

UPDATE 2: Jika Anda meningkatkan ke Angular 2.0.0-rc.1, Anda perlu melakukan hal berikut di file appBoot.ts Anda:

///<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
]);

Yang penting menjadi referensi untuk es6-shim / index.d.ts

Ini mengasumsikan Anda telah menginstal mengetik es6-shim seperti yang ditunjukkan di sini: masukkan deskripsi gambar di sini

Lebih lanjut tentang pengetikan yang diinstal dari Angular di sini: https://angular.io/docs/ts/latest/guide/typescript-configuration.html#!#typings

brando
sumber
Bisakah Anda menyebutkan nomor versi lama yang bermasalah? Terima kasih.
Meligy
1
@Eligy Saya sebelumnya menggunakan gulp-typescript versi 2.12.0
brando
1
Luar biasa. Saya telah memperbarui artikel saya tentang mappesan kesalahan untuk memasukkan catatan untuk pengguna dengan masalah serupa. Terima kasih banyak :)
Meligy
1
@Eligy Saya mengalami masalah yang sama ini lagi ketika saya memutakhirkan ke Angular2 RC. Saya memperbarui jawaban saya di atas untuk menunjukkan bagaimana saya menyelesaikannya.
brando
6
import 'rxjs/Rx'; // Memuat semua fitur
VahidN
67

Rxjs 5.5 “Properti 'peta' tidak ada pada tipe yang Dapat Diobservasi.

Masalahnya terkait dengan fakta bahwa Anda perlu menambahkan pipa di sekitar semua operator.

Ubah ini,

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

untuk ini

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

Dan

Impor peta seperti ini,

import { map } from 'rxjs/operators';

Ini akan menyelesaikan masalah Anda.

Hiran DA Walawage
sumber
3
Ini juga berlaku untuk Rxjs 6. Setiap tutorial yang saya lihat, mereka memiliki fungsi peta tanpa pipa. Ini tidak berfungsi untuk saya sampai saya menambahkan pipa dan mengimpor peta dari 'rxjs / operator' persis seperti yang dinyatakan oleh jawaban.
Keyvan Sadralodabai
Ya, itu juga berlaku untuk Rxjs 6 juga.
Hiran DA Walawage
41

Dalam kasus saya, tidak cukup hanya menyertakan peta dan janji:

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

Saya memecahkan masalah ini dengan mengimpor beberapa komponen rxjs sebagaimana direkomendasikan oleh dokumentasi resmi :

1) Impor pernyataan dalam satu file 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) Impor rxjs-operator itu sendiri dalam layanan Anda:

// Add the RxJS Observable operators we need in this app.
import './rxjs-operators';
Alex Valchuk
sumber
Sekali lagi, jawaban terbaik untuk pertanyaan itu tidak memiliki suara terbanyak. Ini adalah jawaban terbaik untuk pertanyaan ini. Terima kasih sudah berbagi. Saya berharap orang lain akan memilih ini.
sangat dingin
26

Jika Anda melihat kesalahan ini di VS2015, ada masalah github & solusi yang disebutkan di sini:

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

Ini memang membantu saya menyelesaikan property map does not exist on observablemasalah. Selain itu, pastikan Anda memiliki versi naskah di atas 1.8.2

Abu Abdullah
sumber
8
Mengganti C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TypeScript\typescriptServices.js dengan typescriptService bekerja untuk VS 15. ( restart vs setelah mengganti file )
tchelidze
mengganti file yang disebutkan di atas juga berhasil untuk saya
Krishnan
Masih tidak ada pembaruan dari microsoft ... Mengapa mereka tidak memperbaikinya?
Piotrek
26

JAWABAN AKHIR UNTUK MEREKA YANG MENGGUNAKAN ANGULAR 6:

Tambahkan perintah di bawah ini di file * .service.ts Anda "

import { map } from "rxjs/operators";

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

Saya menggunakan windows 10;

angular6 dengan naskah V 2.3.4.0

Smit Patel
sumber
Sepertinya kita tidak bisa lagi hanya mengimpornya di app.module.ts. Sekarang kita perlu mengimpornya di setiap layanan dan komponen
Adam Mendoza
15
import 'rxjs/add/operator/map';

&

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

bekerja untukku

Justin Lange
sumber
13

Dalam Angular 2x

Dalam example.component.ts

import { Observable } from 'rxjs';

Dalam example.component.html

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

Dalam Angular 5x atau Angular 6x:

Dalam example.component.ts

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

Dalam example.component.html

valorAsync = interval(2500).pipe(map(valor => 'Async value'));
Eduardo Cordeiro
sumber
1
mengapa kita perlu menggunakan pipa, bukan peta langsung?
Krish
10

UPDATE 29 Sep 2016 untuk Angular 2.0 Final & VS 2015

Solusi tidak diperlukan lagi, untuk memperbaiki Anda hanya perlu menginstal TypeScript versi 2.0.3 .

Perbaikan diambil dari hasil edit pada komentar masalah github ini .

Jason
sumber
3
Saya punya masalah ini, saya juga sudah menginstal 2.0.3: /
Mild Fuzz
1
saya punya TS 2.1.6 tetapi masih melihat masalah
alltej
Pada saat komentar ini, TS terbaru adalah 2.5.2. Versi ini melanggar bagi saya. Menggunakan 2.3.x works.
PigBoT
10

Seperti yang saya mengerti itu karena rxjspembaruan terakhir. Mereka telah mengubah beberapa operator dan sintaksis. Setelah itu kita harus mengimpor rxoperator seperti ini

import { map } from "rxjs/operators";

bukannya ini

import 'rxjs/add/operator/map';

Dan kita perlu menambahkan pipa di sekitar semua operator seperti ini

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

Sumber ada di sini

Gh111
sumber
9

Seperti yang disarankan Justin Scofield dalam jawabannya, untuk rilis terbaru Angular 5 dan untuk Angular 6, seperti pada tanggal 1 Juni 2018, import 'rxjs/add/operator/map';tidak cukup untuk menghapus kesalahan TS: [ts] Property 'map' does not exist on type 'Observable<Object>'.

Diperlukan untuk menjalankan perintah di bawah ini untuk menginstal dependensi yang diperlukan: npm install rxjs@6 rxjs-compat@6 --savesetelah itu mapkesalahan dependensi impor diselesaikan!

Nitin Bhargava
sumber
1
Sepertinya lebih banyak perubahan yang melanggar yang mengkhawatirkan
Noobie3001
8

Saya menghadapi kesalahan yang sama. Itu terpecahkan ketika saya melakukan tiga hal ini:

  1. Perbarui ke rxjs terbaru:

    npm install rxjs@6 rxjs-compat@6 --save
  2. Impor peta dan janji:

    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/toPromise';
  3. Menambahkan pernyataan impor baru:

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

Sepertinya RxJS terbaru membutuhkan naskah 1,8 sehingga naskah 1,7 melaporkan kesalahan di atas.

Saya memecahkan masalah ini dengan memutakhirkan ke versi naskah terbaru.

Roma
sumber
Jika Anda menggunakan tscdari perintah, silakan periksa tsc -v;-) Menggunakan "skrip" adalah ide yang lebih baik, lihat stackoverflow.com/a/37034227/478584
tomaszbak
6

Pesan kesalahan serupa akan muncul ketika beralih dari versi 5 ke 6. Berikut adalah jawaban untuk perubahan ke rxjs-6.

Impor masing-masing operator, kemudian gunakan pipealih-alih rantai.

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

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

Jika Anda menggunakan angular4, gunakan impor di bawah ini. itu harus bekerja.

impor 'rxjs / add / operator / peta';

Jika Anda menggunakan angular5 / 6 maka gunakan peta dengan pipa dan impor di bawah ini

impor {peta} dari "rxjs / operator";

Manas
sumber
1

properti 'peta' tidak ada pada tipe 'respon yang dapat diamati' sudut 6

Solusi: Perbarui Angular CLI Dan Versi Inti

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 
Jaydeepsinh Makwana
sumber