Thuộc tính 'bản đồ' không tồn tại trên loại 'Có thể quan sát <Phản hồi>'


200

Tôi đang cố gắng gọi API từ Angular nhưng đang gặp lỗi này:

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

Các câu trả lời từ câu hỏi tương tự này không giải quyết được vấn đề của tôi: Angular 2 beta.17: Thuộc tính 'bản đồ' không tồn tại trên loại 'Có thể quan sát <Phản hồi>' .

Tôi đang sử dụng Angular 2.0.0-beta.17.

Câu trả lời:


371

Bạn cần nhập maptoán tử:

import 'rxjs/add/operator/map'

Hay nói chung hơn:

import 'rxjs/Rx';

Lưu ý: Đối với các phiên bản của RxJS 6.x.xtrở lên, bạn sẽ phải sử dụng các toán tử có thể điều chỉnh được như trong đoạn mã dưới đây:

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

Điều này là do nhóm RxJS loại bỏ hỗ trợ cho việc sử dụng Xem các thay đổi vi phạm trong thay đổi của RxJS để biết thêm thông tin.

Từ thay đổi:

Toán tử : Các toán tử có thể điều chỉnh được bây giờ phải được nhập từ rxjs như vậy : import { map, filter, switchMap } from 'rxjs/operators';. Không nhập khẩu sâu.


Tên mô-đun không hợp lệ trong phần mở rộng, mô-đun '../../Observable' không thể tìm thấy. Thuộc tính 'bản đồ' không tồn tại trên loại 'Có thể quan sát <Phản hồi>'.
Malik Kashmiri

Làm thế nào để bạn nhập Observablelớp? Như thế này: import {Observable} from 'rxjs/Observable';hay import {Observable} from 'rxjs/Rx';?
Thierry Templier

Tôi không nhập lớp này cho đến nay
Malik Kashmiri

1
Tôi đang sử dụng Angular 2 RC1 và rxjs 5.0.0-beta2. Tôi đã nhập Observable dưới dạng nhập {Có thể quan sát} từ 'rxjs / có thể quan sát'; và toán tử bản đồ đã nhập như nhập 'rxjs / add / toán tử / map'; Nó hoạt động khi tôi đang sử dụng Beta 7. Tôi mới nâng cấp lên RC1 và nó đã bị hỏng.
Darshan Puranik

4
Đầu tiên hãy viết lệnh này trong vs thiết bị đầu cuối mã của dự án của bạn và khởi động lại dự án. npm install rxjs-compat, hơn là nhập maptoán tử.
Karan Raiyani

162

Xem lại điều này bởi vì giải pháp của tôi không được liệt kê ở đây.

Tôi đang chạy Angular 6 với rxjs 6.0 và gặp phải lỗi này.

Đây là những gì tôi đã làm để khắc phục nó:

tôi đã thay đổi

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

chỉ đơn giản là:

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

Tôi tìm thấy bản sửa lỗi ở đây:

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


1
Tôi không chắc tại sao công cụ di chuyển rxjs-5-to-6-di chuyển không nhận được điều này? Thật thú vị khi nó không giải quyết việc ánh xạ lại / chạm mà trong môi trường của tôi vẫn chưa được giải quyết mặc dù công cụ nhập khẩu nhận ra nó. 90% 'thời gian lãng phí không lường trước được' của tôi trong phát triển Angular được dành cho các vấn đề ranh giới về tài liệu và mã RxJS, điều này thực sự gây nản lòng.
Joe

1
Cảm ơn bạn! Bạn là một phao cứu sinh !! Bất cứ ai quan tâm, tài liệu tham khảo đầy đủ về thay đổi này đều có sẵn tại đây: github.com/ReactiveX/rxjs/blob/master/
mẹo

21
Điều này làm việc cho tôi, tôi cũng cần phải thêmimport { map } from 'rxjs/operators';
paul

Thật buồn cười, đây chính xác là cách chúng tôi sửa nó trên bản nâng cấp 6 góc - cũng mang đến những bản rxj mới nhất.
Tối đa

2
@paul Cảm ơn. Về .catch, chúng ta có thể sử dụng catchErrornhư thế .pipe(catchError(this.handleError))nào?
FindOutIslamNow

60

chỉ cần viết lệnh này trong vs thiết bị đầu cuối mã của dự án của bạn và khởi động lại dự án.

npm install rxjs-compat

Bạn cần nhập maptoán tử bằng cách viết này:

import 'rxjs/add/operator/map';

1
nếu nó không hoạt động, đóng tất cả các tập tin và khởi động lại vs studio.
Ajay Takur

1
Điều này làm việc cho tôi, cảm ơn vì đã chia sẻ.
thesamoanppprogrammer

30

Đối với 7v góc

Thay đổi

import 'rxjs/add/operator/map';

Đến

import { map } from "rxjs/operators"; 

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

nó đã giúp tôi @ Katana24 khi tôi thấy cú pháp đúng với pipe.
nghiên cứu nhạc punk

25

Tôi gặp vấn đề tương tự với Angular 2.0.1 vì tôi đang nhập Observable từ

import { Observable } from 'rxjs/Observable';

Thay vào đó, tôi giải quyết vấn đề của mình khi nhập Observable từ đường dẫn này

import { Observable } from 'rxjs';

Thực tiễn này được coi là không thân thiện với kích thước bó vì câu lệnh đó nhập tất cả các toán tử của Observable(bao gồm cả các toán tử mà bạn không sử dụng) vào gói. Thay vào đó, bạn nên nhập từng toán tử riêng lẻ. Tôi khuyên bạn nên sử dụng "toán tử cho phép", được giới thiệu trong RxJS v5.5 để hỗ trợ rung cây tốt hơn.
Sarun Intaralawan

15

Trong rxjs 6 cách sử dụng toán tử bản đồ đã được thay đổi, bạn cần sử dụng nó như thế này.

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

Để tham khảo https://www.academind.com/learn/javascript/rxjs-6-what-changed/#operators-update-path


Hãy lưu ý câu trả lời này vì bất kỳ ai đang làm RxJS v6sẽ cần phải sử dụng .pipe()hoặc không ai trong số các nhà khai thác sẽ làm việc trực tiếp ngoài Đài quan sát. Bạn sẽ thấy một lỗi như,Property 'share' does not exist on type 'Observable<{}>'
atconway 26/07/18

8

chỉ cần cài đặt rxjs-compat bằng cách gõ vào terminal:

npm install --save rxjs-compat

sau đó nhập:

import 'rxjs/Rx';

8

Trong Angular 7. *. * Mới nhất , bạn có thể thử cách này đơn giản như:

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

Và sau đó bạn có thể sử dụng chúng methodsnhư sau:

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

Kiểm tra bản demo này để biết thêm chi tiết.


5

Trong trường hợp của tôi, nó chỉ đủ để bao gồm bản đồ và lời hứa:

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

Tôi đã giải quyết vấn đề này bằng cách nhập một số thành phần rxjs như tài liệu chính thức khuyến nghị:

1) Nhập câu lệnh trong một tệp ứng dụng / rxjs-oper.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) Nhập chính toán tử rxjs trong dịch vụ của bạn:

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

Tôi cảm thấy không đúng khi đưa các nhà khai thác rxjs vào mọi dịch vụ. Nó chỉ được bao gồm tại app.module.ts nhưng không may kiểm tra sẽ ném lỗi nếu các nhà khai thác không được nhập ở những nơi cụ thể
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));
}

Trong hàm trên, bạn có thể thấy tôi đã không sử dụng res.json () vì tôi đang sử dụng HttpClient. Nó tự động áp dụng res.json () và trả về Có thể quan sát được (httpResponse <chuỗi>). Bạn không còn cần phải tự gọi hàm này sau góc 4 trong HttpClient.


3

Tôi gặp vấn đề tương tự, tôi đang sử dụng Visual studio 2015 có phiên bản cũ hơn của bản thảo.

Sau khi nâng cấp phần mở rộng, vấn đề đã được giải quyết.

Liên kết tải xuống


3

Tôi đang sử dụng Angular 5.2 và khi tôi sử dụng, import 'rxjs/Rx';nó sẽ gây ra lỗi lint sau: TSLint: Việc nhập này bị liệt vào danh sách đen, thay vào đó hãy nhập một mô hình con (danh sách đen)

Xem ảnh chụp màn hình bên dưới: Nhập rxjs / Rx được đưa vào danh sách đen trong Angular 5.2

GIẢI PHÁP: Giải quyết nó bằng cách chỉ nhập các toán tử mà tôi cần . Ví dụ sau:

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

Vì vậy, sửa chữa sẽ chỉ nhập cụ thể các toán tử cần thiết.


@AndrewBenjamin Tôi khuyên bạn nên làm điều đó. Điều đó sẽ giúp bạn tiết kiệm rất nhiều rắc rối xuống làn đường.
Devner

3

Đơn giản chỉ cần cài đặt rxjs-compat để giải quyết vấn đề

npm i rxjs-compat --save-dev

Và nhập nó như dưới đây

import 'rxjs/Rx';

3

Trước hết chạy cài đặt như dưới đây:

npm install --save rxjs-compat@6

Bây giờ bạn cần nhập rxjsvào service.ts:

import 'rxjs/Rx'; 

Voila! Vấn đề đã được giải quyết.



2

Tôi đã thử tất cả các câu trả lời có thể được đăng ở trên không ai trong số họ làm việc,

Tôi đã giải quyết nó bằng cách khởi động lại IDE của mình, tức là Visual Studio Code

Có thể nó sẽ giúp ai đó.


2

Tôi cũng phải đối mặt với lỗi tương tự. Một giải pháp mà làm việc cho tôi là để thêm các dòng sau trong bạn service.ts nộp thay vì của import 'rxjs/add/operator/map':

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

Ví dụ: app.service.ts của tôi sau khi gỡ lỗi là như thế,

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

Nếu sau khi nhập nhập 'rxjs / add / toán tử / map' hoặc nhập 'rxjs / Rx' thì bạn cũng gặp lỗi tương tự, sau đó khởi động lại trình chỉnh sửa mã phòng thu trực quan của bạn, lỗi sẽ được giải quyết.


1

Đối với tất cả những người dùng linux đang gặp vấn đề này, hãy kiểm tra xem thư mục rxjs-compat có bị khóa hay không. Tôi đã có vấn đề chính xác như vậy và tôi đã đi vào terminal, sử dụng sudo su để cấp quyền cho toàn bộ thư mục rxjs-compat và nó đã được sửa. Đó là giả sử bạn nhập khẩu

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

trong tệp project.ts nơi xảy ra lỗi .map gốc.


1

Sử dụng mapchức năng trong pipechức năng và nó sẽ giải quyết vấn đề của bạn. Bạn có thể kiểm tra tài liệu ở đây .

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

 }

chạy lệnh

 npm install rxjs-compat 

Tôi chỉ nhập

 import 'rxjs/add/operator/map';

khởi động lại vs mã, vấn đề được giải quyết.


-1

Phiên bản mới góc cạnh không hỗ trợ .map bạn phải cài đặt phiên bản này thông qua cài đặt cmd npm --save rxjs-compat thông qua điều này bạn có thể thưởng thức với kỹ thuật cũ. lưu ý: đừng quên nhập các dòng này.

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

1
Câu trả lời muộn này là dư thừa.
Tom Falkishk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.