Angular 6管道操作从observable中删除键入

时间:2018-06-18 17:22:04

标签: angular rxjs angular6 rxjs6

我刚从 Angular5 更新到 6 。更新后,我运行代码以迁移到 rxjs6 ,它改变了我使用takeWhile的代码。现在,为了订阅服务,我的代码如下所示:

this.menuService.currentMenu.pipe(takeWhile(() => this.isAlive))
   .subscribe(result => { 
      if(result && result.name)
      {
         //do stuff
      }
   }
);

使用此import声明

import { takeWhile } from 'rxjs/operators';

查看 rxjs6 的文档后,看起来这是现在使用takewhile的正确方法;但我得错误说:

  

“{}”

类型中不存在“名称”属性

看起来takewhile操作正在剥离其输入的observable。它也发生在filter,因此我认为pipe是问题。

当我在stackblitz中设置测试时,我没有收到错误,我希望这可能是针对stackblitz中的项目而不是在同一个 typescript 版本上?

这是我正在使用的版本:

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 6.0.8
Node: 10.4.1
OS: darwin x64
Angular: 6.0.5
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router

Package                            Version
------------------------------------------------------------
@angular-devkit/architect          0.6.8
@angular-devkit/build-angular      0.6.8
@angular-devkit/build-optimizer    0.6.8
@angular-devkit/core               0.6.8
@angular-devkit/schematics         0.6.8
@angular/cdk                       6.2.1
@angular/cli                       6.0.8
@angular/material                  6.2.1
@angular/material-moment-adapter   6.2.1
@ngtools/webpack                   6.0.8
@schematics/angular                0.6.8
@schematics/update                 0.6.8
rxjs                               6.2.1
typescript                         2.7.2
webpack                            4.8.3

修改 明确指定类型可以解决问题。但我不明白为什么我应该这样做,为什么它不能只是保持打字。

this.menuService.currentMenu.pipe(takeWhile(() => this.isAlive))
   .subscribe((result: ResultClass) => { 
      if(result && result.name)
      {
         //do stuff
      }
   }
);

1 个答案:

答案 0 :(得分:2)

似乎是由于我合并使用旧版本的 Visual Studio代码而将node处理的npm / nvm安装由npm处理引起的, em>。

一旦我更新到新的 Visual Studio Code 1.24.1 ,问题就消失了。


完整说明:

我认为 Visual Studio Code 的旧版本不知道在何处查找nvm安装。我收到一个错误消息(不是立即,更新到npm大约一天后)说了一些关于Automatic Type Acquisitionnpm的问题,并发现this article关于如何解决此问题。我可以通过终端正常使用Automatic Type Acquisition,这似乎已经引起了which npm的问题(这是我的猜测)。

我尝试使用terminal中的nvm命令来找到安装路径,并按照本文的指示将其放入设置文件中。它似乎无法解决问题。这可能是因为我使用了错误的路径,或者我可能忘记了重新启动 Visual Studio代码才能使设置生效(我认为我确实已经重新启动了),无论哪种方式,我都决定只恢复我的设置文件并更新 Visual Studio代码,以查看新版本是否可以与nvm配合使用。

所以我的猜测是新的 Visual Studio代码了解npm,并可以找到subscribe安装。

有趣的是,如果我在observable上进行直接rxjs的话,它可以正确地保持键入。也许升级到新的{{1}}以及其他两件事都是问题的一部分。