Властивість "map" не існує для типу "Спостережуваний <Response>"


199

Я намагаюся викликати API від Angular, але отримую цю помилку:

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

Відповіді на подібне запитання не вирішили мою проблему: Angular 2 beta.17: Властивість 'map' не існує у типі 'Observable <Response>' .

Я використовую Angular 2.0.0-beta.17.

Відповіді:


371

Вам потрібно імпортувати mapоператора:

import 'rxjs/add/operator/map'

Або загалом:

import 'rxjs/Rx';

Примітка. Для версій RxJS 6.x.xі новіших версій вам доведеться використовувати оператори, що передаються на трубу, як показано в фрагменті коду нижче:

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

Це спричинено тим, що команда RxJS видаляє підтримку для використання. Щоб отримати додаткову інформацію, перегляньте зміни, що відбуваються в журналі змін RxJS.

З журналу змін:

Оператори : Pipeable оператори тепер повинні бути імпортовані з rxjs подобається так: import { map, filter, switchMap } from 'rxjs/operators';. Ніякого глибокого імпорту.


Недійсне ім'я модуля в розширенні, модуль '../../Observable' не знайдено. Властивість 'map' не існує у типі 'Observable <Response>'.
Малік Кашмірі

Як ви імпортуєте Observableклас? Так: import {Observable} from 'rxjs/Observable';або import {Observable} from 'rxjs/Rx';?
Тіррі Темплієр

Я поки що не імпортую цей клас
Малік Кашмірі

1
Я використовую Angular 2 RC1 і rxjs 5.0.0-beta2. Я імпортував Observable як імпорт {Observable} з 'rxjs / observable'; та імпортований оператор карт, наприклад імпорт 'rxjs / add / operator / map'; Він працював, коли я використовував бета-версію 7. Я просто перейшов на RC1 і він зламався.
Даршан Пуранік

4
Спочатку напишіть цю команду в термінал проти коду вашого проекту та перезапустіть проект. npm install rxjs-compat, ніж імпортувати mapоператора.
Karan Raiyani

162

Перегляньте це, оскільки тут не вказано моє рішення.

Я запускаю Angular 6 з rxjs 6.0 і зіткнувся з цією помилкою.

Ось що я зробив, щоб виправити це:

я змінив

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

просто бути:

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

Тут я знайшов виправлення:

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


1
Я не впевнений, чому інструмент міграції rxjs-5-to-6-migrate не підбирає це? Цікаво, що він не стосується повторного відображення do / tap, яке в моєму середовищі досі не вирішено, хоча інструмент імпорту розпізнає це. 90% мого "несподіваного витраченого часу" на розробку Angular витрачається на проблеми з документом та кодами RxJS, це насправді засмучує.
Джо

1
Дякую! Ви рятувальник !! Кому цікаво, повна посилання на цю зміну доступна тут: github.com/ReactiveX/rxjs/blob/master/…
malvadao

21
Це працювало для мене, мені також потрібно було додатиimport { map } from 'rxjs/operators';
Пауль

Смішно, саме так ми виправили це під кутом 6 оновлення - яке також принесло останні rxjs.
Макс

2
@paul Спасибі Що стосується .catch, ми можемо використовувати catchErrorяк .pipe(catchError(this.handleError))?
FindOutIslamNow

60

просто напишіть цю команду в термінал проти коду вашого проекту та перезапустіть проект.

npm install rxjs-compat

Вам потрібно імпортувати mapоператора, написавши це:

import 'rxjs/add/operator/map';

1
якщо це не працює, закрийте всі файли та перезапустіть vs studio.
Аджай Такур

1
Це працювало для мене, дякую за спільний доступ.
thesamoanppprogrammer

30

Для кутових 7v

Зміна

import 'rxjs/add/operator/map';

До

import { map } from "rxjs/operators"; 

І

 return this.http.get('http://localhost/ionicapis/public/api/products')
 .pipe(map(res => res.json()));

це допомогло мені @ Katana24, коли я побачив правильний синтаксис з pipe.
панколог

25

У мене була така ж проблема з Angular 2.0.1, оскільки я імпортував Observable з

import { Observable } from 'rxjs/Observable';

Я вирішую свою проблему з імпортом спостерігаючого з цього шляху

import { Observable } from 'rxjs';

Ця практика вважається непридатною до розміру в комплекті, оскільки ця операція імпортує Observableв пакет усіх операторів (включаючи тих, які ви не використовуєте). Натомість слід імпортувати кожного оператора окремо. Рекомендую використовувати "доступні оператори", які були представлені в RxJS v5.5 для підтримки кращого струшування дерев.
Сарун Інтаралаван

15

У rxjs 6 використання оператора карт було змінено, тепер вам потрібно використовувати його так.

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

Для довідки https://www.academind.com/learn/javascript/rxjs-6-what-changed/#operators-update-path


Візьміть до уваги цю відповідь, оскільки будь-хто, хто робить RxJS v6це, повинен буде використовувати .pipe()або ніхто з операторів не буде працювати безпосередньо з "Спостережуваного". Ви побачите помилку на кшталт,Property 'share' does not exist on type 'Observable<{}>'
atconway

8

просто встановіть rxjs-compat, ввівши термінал:

npm install --save rxjs-compat

потім імпортуйте:

import 'rxjs/Rx';

7

В останній кутовий 7. *. * Ви можете спробувати це просто:

import { Observable, of } from "rxjs";
import { map, catchError } from "rxjs/operators";

І тоді ви можете скористатись methodsтакими:

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

Перевірте цю демонстрацію для отримання більш детальної інформації.


5

У моєму випадку було б недостатньо включити лише карту та обіцянку:

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

Я вирішив цю проблему, імпортуючи кілька компонентів rxjs, оскільки офіційна документація рекомендує:

1) Імпорт заяв в одному файлі 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) Імпортуйте сам rxjs-оператор у вашу послугу:

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

Я вважаю, що не правильно включати rxjs-операторів у всі сервіси. Він повинен бути включений лише на app.module.ts, але, на жаль, тестова помилка кидає, якщо оператори не імпортовані в певні місця
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));
}

У наведеній вище функції ви бачите, що я не використовував res.json (), оскільки я використовував HttpClient. Він застосовує res.json () автоматично та повертає спостережуване (HttpResponse <string>). Вам більше не потрібно називати цю функцію самостійно після кутового 4 у HttpClient.



3

Я використовую Angular 5.2 і коли я import 'rxjs/Rx';його використовую, видає мені таку помилку вказівки: TSLint: Цей імпорт перебуває у чорному списку, замість цього імпортуйте підмодуль (import-blacklist)

Дивіться скріншот нижче: Імпорт rxjs / Rx перебуває у чорному списку у кутовій частині 5.2

РІШЕННЯ: Вирішили це, імпортуючи лише ті оператори, які мені потрібні . Приклад наступний:

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

Тож виправленням було б імпортувати конкретно лише необхідних операторів.


@AndrewBenjamin Я настійно пропоную зробити це. Це вбереже вам багато клопоту вниз по смузі.
Девнер

3

Для вирішення проблеми просто встановіть rxjs-compat

npm i rxjs-compat --save-dev

І імпортуйте як нижче

import 'rxjs/Rx';

3

Перш за все запустіть інсталяцію, як показано нижче:

npm install --save rxjs-compat@6

Тепер вам потрібно імпортувати rxjsв service.ts:

import 'rxjs/Rx'; 

Вуаля! Проблема була виправлена.



2

Я спробував усі можливі відповіді, розміщені вище, жодна з них не працювала,

Я вирішив це, просто перезавантаживши свій IDE, тобто Visual Studio Code

Нехай це комусь допоможе.


2

Я теж зіткнувся з тією ж помилкою. Одне рішення , яке працювало для мене було додати наступні рядки в service.ts файл замість з import 'rxjs/add/operator/map':

import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

Наприклад, мій app.service.ts після налагодження виглядав так,

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

Якщо після імпорту імпорту 'rxjs / add / operator / map' або імпорту 'rxjs / Rx' ви також отримуєте ту ж помилку, то перезавантажте редактор коду візуальної студії, помилка буде усунена.


1

для всіх тих користувачів Linux, які мають цю проблему, перевірте, чи папка rxjs-compat заблокована. У мене була така ж проблема, і я зайшов у термінал, використовував sudo su, щоб дати дозвіл на всю папку rxjs-compat, і це було виправлено. Це припускаючи, що ви імпортували

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

у файлі project.ts, де сталася початкова помилка .map.


1

Використовуйте mapфункцію у pipeфункції, і вона вирішить вашу проблему. Ви можете перевірити документацію тут .

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

 }

запустити команду

 npm install rxjs-compat 

Я просто імпортую

 import 'rxjs/add/operator/map';

перезапустити vs код, проблему вирішено.


-1

Нова кутова версія не підтримує .map вам потрібно встановити це через cmd npm install --save rxjs-compat, завдяки якому ви можете насолоджуватися старою технікою. Примітка: не забудьте імпортувати ці рядки.

import { Observable, Subject } from 'rxjs';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

1
Ця пізня відповідь є зайвою.
Том Фалтесек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.