【问题标题】:Angular 6 pipe operations remove typing from observableAngular 6 管道操作从 observable 中移除类型
【发布时间】:2018-06-18 17:22:03
【问题描述】:

我刚刚从 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
      }
   }
);

【问题讨论】:

  • 可能是一些打字稿版本问题。 subscribe(result: any) 将解决问题
  • : any 添加到订阅并不能解决问题。
  • 如果像 subscribe((result: any) => ...) 这样使用 any 没有帮助,那么问题出在其他地方,而不是在 takeWhile
  • @martin 好的,subscribe((result: any) => ...) 工作。 (带有额外的括号)。但是为什么我需要在我的项目中指定类型,而在 Stackblitz 上它会自动从 observable 继承?
  • 我怀疑它是takeWhile,因为const source = of(1).pipe(takeWhile(() => true)) 看到source 推断为Observable<number>。我认为这取决于this.menuService.currentMenu 的类型,而这不包括在问题中。

标签: angular rxjs angular6 rxjs6


【解决方案1】:

似乎是由于我在使用旧版本的 Visual Studio Code 时将我的 node/npm 安装更改为由 nvm 处理造成的。

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


完整解释:

我认为旧版本的 Visual Studio Code 不知道在哪里寻找 npm 安装。我收到了一个错误(不是马上,大约是更新到nvm 后的一天),我说了一些关于npmAutomatic Type Acquisition 的信息,并找到了this article 来解决这个问题。我可以通过终端很好地使用npm,这似乎导致了Automatic Type Acquisition 的问题(这是我的猜测)。

我尝试在terminal 中使用which npm 命令来查找安装路径,并按照文章的指示将其放入设置文件中。它似乎没有解决问题。这可能是因为我使用了不正确的路径,或者我可能忘记重新启动 Visual Studio Code 以使设置生效(我想我确实重新启动了),无论哪种方式我决定只是恢复我的设置文件并更新 Visual Studio Code 以查看新版本是否可以与 nvm 配合使用。

所以我的猜测是新的 Visual Studio Code 知道 nvm 并且可以找到 npm 安装。

有趣的是,如果我在observable 上直接输入subscribe,它可以正确地保持打字。也许升级到新的rxjs 与其他两件事一样是问题的一部分。

【讨论】:

  • 您对nvm 的评价很有趣。就我而言,我检查了 yarn/npm、node、ng 版本问题,但我根本没有检查 nvm。最后,出于绝望,我做了一个 git rollback 并继续使用我之前的 Angular 5 版本。
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多