【问题标题】:Why am I getting error TS2339: Property 'scan' does not exist on type 'Subject<any>'?为什么我收到错误 TS2339:“主题<any>”类型上不存在属性“扫描”?
【发布时间】:2019-06-06 22:13:37
【问题描述】:

编辑:实际上,现在我想知道。 Rxjs 是否在 6.x 中从链接转移到管道?见:https://stackoverflow.com/a/49811404/8207637


这是我第一次使用 rxjs 流。我正在尝试创建一些相当简单的,但在 tslint 和构建时都会收到此错误。

我花了几个小时在谷歌上搜索并试图弄清楚。看到几个人推荐直接导入算子。但这需要将它们包装在 pipe() 中才能使用它们。我希望能够将它们链接在一起。

当我发现我可能需要添加 rxjs-compat 来解决问题时,我已经开始整理一个 StackBlitz 示例来玩玩。所以我在 StackBlitz 示例中添加了rxjs-compat瞧!错误消失了。

所以我想如果我将包添加到我的项目中,我可以期待类似的结果。没有!

不确定如何解决问题。我已经链接到 stackblitz,它显示了导入工作和构建工作(服务文件什么都不做)。

Stackblitz https://stackblitz.com/edit/angular-rxjs-init

这是我的项目文件(不是来自 stackblitz)

package.json

{
  "name": "ng7-zprod",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "^7.1.4",
    "@angular/cdk": "^7.2.0",
    "@angular/common": "~7.1.0",
    "@angular/compiler": "~7.1.0",
    "@angular/core": "~7.1.0",
    "@angular/forms": "~7.1.0",
    "@angular/material": "^7.2.0",
    "@angular/platform-browser": "~7.1.0",
    "@angular/platform-browser-dynamic": "~7.1.0",
    "@angular/router": "~7.1.0",
    "@ncstate/sat-popover": "^3.1.0",
    "core-js": "^2.5.4",
    "jquery": "^1.9.1",
    "popper.js": "^1.14.6",
    "rxjs": "~6.3.3",
    "rxjs-compat": "^6.3.3",
    "tslib": "^1.9.0",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^0.11.4",
    "@angular/cli": "~7.1.3",
    "@angular/compiler-cli": "~7.1.0",
    "@angular/language-service": "~7.1.0",
    "@fortawesome/fontawesome-free": "^5.6.3",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "~8.9.4",
    "bootstrap": "^4.2.1",
    "codelyzer": "~4.5.0",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~3.1.1",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.1.6"
  }
}

Service.ts

import { Injectable } from '@angular/core';
import { Subject, Observable } from 'rxjs';
import { ZTask } from '../models/ztask';



const initialZTasks: ZTask[] = [];

interface IZTaskOperation extends Function {
  // tslint:disable-next-line:callable-types
  (ztasks: ZTask[]): ZTask[];
}

@Injectable({
  providedIn: 'root'
})
export class ZTasksService {
  newTasks: Subject<ZTask> = new Subject<ZTask>();

  ztasksList: Observable<ZTask[]>;

  ztasksListUpdates: Subject<any> = new Subject<any>();

  ztaskcreate: Subject<ZTask> = new Subject<ZTask>();

  constructor() {
    this.ztasksList = this.ztasksListUpdates
    .scan((ztasks: ZTask[],                     // this line is where I get the error
           operation: IZTaskOperation) => {
             return operation(ztasks);
           },
           initialZTasks)
    .publishReplay(1)
    .refCount();
  }
}

【问题讨论】:

  • 您的编辑是正确的。 “scan”现在是在“.pipe()”中调用的运算符
  • 谢谢@dmcgrandle!知道他们为什么决定做出这种改变吗?功能还是一样的吗?
  • 更改主要是为了摇树。很多不同,我建议阅读官方文档,但这还不错:academind.com/learn/javascript/rxjs-6-what-changed

标签: angular rxjs


【解决方案1】:

正如@dmcgrandle 在他的评论中所说,为了改变他们的目录声明,Rxjs 已经放弃了链接。

这实际上清理了相当多的导入语句。

据说当我安装rxjs-compat 时它应该已经修复,但事实并非如此。不知道为什么。

但是现在使用管道是正确的方法。像这样:

import { Injectable } from '@angular/core';
import { Subject, Observable } from 'rxjs';
import { ZTask } from '../models/ztask';
import { scan, publishReplay, refCount } from 'rxjs/operators';



const initialZTasks: ZTask[] = [];

interface IZTaskOperation extends Function {
  // tslint:disable-next-line:callable-types
  (ztasks: ZTask[]): ZTask[];
}

@Injectable({
  providedIn: 'root'
})
export class ZTasksService {
  newTasks: Subject<ZTask> = new Subject<ZTask>();

  ztasksList: Observable<ZTask[]>;

  ztasksListUpdates: Subject<any> = new Subject<any>();

  ztaskcreate: Subject<ZTask> = new Subject<ZTask>();

  constructor() {
    this.ztasksList = this.ztasksListUpdates.pipe(
    scan((ztasks: ZTask[],                     
           operation: IZTaskOperation) => {
             return operation(ztasks);
           },
           initialZTasks),
    publishReplay(1),
    refCount()
   )
  }
}

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 2019-10-17
    • 2021-06-21
    • 1970-01-01
    • 2018-10-25
    • 2020-06-27
    • 2018-08-02
    • 2021-06-22
    • 2019-08-05
    相关资源
    最近更新 更多