【问题标题】:Angular 2 beta.17: Property 'map' does not exist on type 'Observable<Response>'Angular 2 beta.17:“Observable<Response>”类型上不存在属性“map”
【发布时间】:2016-08-25 04:05:23
【问题描述】:

我刚刚从 Angular 2 beta16 升级到 beta17,而这又需要 rxjs 5.0.0-beta.6。 (这里的更新日志:https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta17-2016-04-28)在 beta16 中,关于 Observable/map 功能的一切都运行良好。我升级后出现以下错误,并且在 typescript 尝试转译时出现:

  1. “Observable”类型上不存在属性“map”(在我使用带有 observable 的地图的任何地方)
  2. c:/path/node_modules/rxjs/add/operator/map.d.ts(2,16):错误 TS2435:环境模块不能嵌套在其他模块或命名空间中。
  3. c:/path/node_modules/rxjs/add/operator/map.d.ts(2,16):错误 TS2436:环境模块声明无法指定相对模块名称。

我已经看到了这个问题/答案,但它没有解决问题:Observable errors with Angular2 beta.12 and RxJs 5 beta.3

我的 appBoot.ts 看起来像这样(我已经在引用 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
]);

有人知道发生了什么事吗?

【问题讨论】:

标签: typescript angular rxjs


【解决方案1】:

“可观察响应”角度 6 类型上不存在属性“地图”

解决方案: 更新 Angular CLI 和核心版本

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 

【讨论】:

    【解决方案2】:

    我遇到了类似的错误。做了这三件事就解决了:

    1. 更新到最新的rxjs:

      npm install rxjs@6 rxjs-compat@6 --save
      
    2. 导入地图和承诺:

      import 'rxjs/add/operator/map';
      import 'rxjs/add/operator/toPromise';
      
    3. 添加了新的导入语句:

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

    【讨论】:

      【解决方案3】:

      使用 Angular 6 的人的最终答案:

      在您的 *.service.ts 文件中添加以下命令”

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

      我正在使用 窗户 10;

      angular6 与 typescript V 2.3.4.0

      【讨论】:

      • 看来我们不能再只在 app.module.ts 中导入它了。现在我们需要在每个服务和组件中导入它
      【解决方案4】:

      如果您使用的是 angular4,请使用以下导入。它应该可以工作。

      import 'rxjs/add/operator/map';

      如果您使用的是 angular5/6,则使用带有管道的 map 并在下面导入

      从“rxjs/operators”导入{ map };

      【讨论】:

        【解决方案5】:

        据我了解,这是因为 rxjs 上次更新。他们更改了一些运算符和语法。此后我们应该像这样导入rx 运算符

        import { map } from "rxjs/operators";

        而不是这个

        import 'rxjs/add/operator/map';
        

        我们需要像这样在所有运算符周围添加管道

        this.myObservable().pipe(map(data =&gt; {}))

        来源是here

        【讨论】:

          【解决方案6】:

          在 Angular 2x 中

          在example.component.ts中

          import { Observable } from 'rxjs';
          

          在example.component.html中

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

          在 Angular 5x 或 Angular 6x 中:

          在example.component.ts中

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

          在example.component.html中

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

          【讨论】:

          • 为什么我们需要直接使用管道而不是映射?
          【解决方案7】:

          正如贾斯汀斯科菲尔德在他的回答中所建议的那样,对于 Angular 5 的最新版本和 Angular 6,截至 2018 年 6 月 1 日,仅import 'rxjs/add/operator/map'; 不足以消除 TS 错误: [ts] Property 'map' does not exist on type 'Observable&lt;Object&gt;'.

          需要运行以下命令来安装所需的依赖项: npm install rxjs@6 rxjs-compat@6 --save 之后 map 导入依赖错误得到解决!

          【讨论】:

          • 看起来有更多令人担忧的重大变化
          【解决方案8】:
          import 'rxjs/add/operator/map';
          

          &

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

          为我工作

          【讨论】:

            【解决方案9】:

            Rxjs 5.5“ Observable 类型上不存在属性‘map’。

            问题与您需要在所有运算符周围添加管道有关。

            改变这个,

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

            到这里

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

            像这样导入地图,

            import { map } from 'rxjs/operators';
            

            它会解决你的问题。

            【讨论】:

            • 这也适用于 Rxjs 6。我看的每一个教程,他们都有没有管道的地图功能。这对我不起作用,直到我完全按照答案状态添加了管道并从 'rxjs/operators' 导入了地图。
            • 是的,它也适用于 Rxjs 6。
            【解决方案10】:

            从版本 5 转换到 6 时会弹出类似的错误消息。这是更改为 rxjs-6 的答案。

            导入单个运算符,然后使用pipe 而不是链接。

            import { map, delay, catchError } from 'rxjs/operators'; 
            
            source.pipe(
              map(x => x + x),
              delay(4000),
              catchError(err => of('error found')),
            ).subscribe(printResult);
            

            【讨论】:

              【解决方案11】:

              需要导入map操作符:

              import 'rxjs/add/operator/map'
              

              【讨论】:

              • Angular 团队和 RxJS 团队都不推荐像这样导入整个 RX 的方法。你不应该那样做。它太大了。上面的第一个答案很好,但第二个答案不是很多。 @0x1ad2 您能否更新您的答案以不将大量导入作为第二个选项?
              • 这是不直观的。这在哪里记录为在 Angular 2+ 开发中实现 Observable 的依赖项?
              • 这适用于 ionic 3.20.0 吗?我遇到了同样的问题,因为 ionic 没有自动导入地图。显式导入有效,但我不确定这是否正确。
              • 这对我来说并不能解决很多人的问题 我不得不使用 Pipe 而不是 rxjs/add/operator/map 我使用 rxjs/operators 导入管道和 .pipe(map(res=> res.json()));
              • 在我们现在使用 Angular 7 并且 RXJS 经历了一些变化的时候,我经过一些 Google 搜索后来到这里。新方法是import { map } from 'rxjs/operators',但another answer有更多细节。
              【解决方案12】:

              2016 年 9 月 29 日更新 Angular 2.0 Final 和 VS 2015

              不再需要解决方法,要修复你只需要install TypeScript version 2.0.3

              this github issue comment 的编辑中获取的修复。

              【讨论】:

              • 我有这个问题,我也安装了 2.0.3 :/
              • 我有 TS 2.1.6 但仍然看到问题
              • 在发表此评论时,TS 最新版本为 2.5.2。这个版本对我来说很糟糕。使用 2.3.x 有效。
              【解决方案13】:

              就我而言,仅包含 map 和 promise 是不够的:

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

              我按照official documentation 的建议导入了几个 rxjs 组件解决了这个问题:

              1) 在一个 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) 在您的服务中导入 rxjs-operator 本身:

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

              【讨论】:

              • 再一次,这个问题的最佳答案并没有获得最多的选票。这是这个问题的最佳答案。谢谢你的分享。我希望其他人对此投赞成票。
              【解决方案14】:

              我将我的 gulp-typescript 插件升级到最新版本 (2.13.0),现在它可以顺利编译了。

              更新 1:我以前使用 gulp-typescript 版本 2.12.0

              更新 2:如果您要升级到 Angular 2.0.0-rc.1,您需要在 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
              ]);
              

              重要的是引用 es6-shim/index.d.ts

              这假设您已经安装了 es6-shim 类型,如下所示:

              更多关于从 Angular 安装的类型在这里:https://angular.io/docs/ts/latest/guide/typescript-configuration.html#!#typings

              【讨论】:

              • 能否请您提及有问题的旧版本号?谢谢。
              • @Meligy 我以前使用 gulp-typescript 2.12.0 版
              • 太棒了。我有updated 我关于map 错误消息的文章,其中包含针对有类似问题的用户的注释。非常感谢:)
              • @Meligy 当我升级到 Angular2 RC 时,我又遇到了同样的问题。我更新了上面的答案以显示我是如何解决它的。
              • import 'rxjs/Rx'; // 加载所有特征
              【解决方案15】:

              如果您碰巧在 VS2015 中看到此错误,这里提到了一个 github 问题和解决方法:

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

              这确实帮助我解决了property map does not exist on observable 问题。 此外,请确保您的 typescript 版本高于 1.8.2

              【讨论】:

              • typescriptService 替换 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TypeScript\typescriptServices.js 适用于 VS 15。(替换文件后重新启动与
              • 替换上述文件也对我有用
              • 微软仍然没有更新...为什么他们不修复它?
              【解决方案16】:

              看起来最新的 RxJS 需要 typescript 1.8,所以 typescript 1.7 报告上述错误。

              我通过升级到最新的 typescript 版本解决了这个问题。

              【讨论】:

              猜你喜欢
              • 2016-09-09
              • 2016-12-01
              • 1970-01-01
              • 2018-02-01
              • 2020-12-18
              • 2018-11-30
              • 2016-10-31
              相关资源
              最近更新 更多