Почему я получаю ошибку TS2339: свойство 'scan' не существует для типа 'Subject <any>'? - PullRequest
0 голосов
/ 12 января 2019

РЕДАКТИРОВАТЬ : На самом деле, теперь мне интересно. Перешел ли Rxjs из цепочки в конвейер в 6.x? Смотри: https://stackoverflow.com/a/49811404/8207637


Я впервые использую потоки rxjs. Я пытаюсь создать несколько довольно простых, но продолжаю получать эту ошибку как из tslint, так и при сборке.

Я провел несколько часов, гугля и пытаясь понять это. Видно несколько человек рекомендуют импортировать операторов напрямую. Но для этого необходимо заключить их в pipe(), чтобы использовать их. Я бы предпочел иметь возможность связать их вместе.

Я уже начал собирать пример StackBlitz, чтобы поиграть с ним, когда обнаружил, что мне может понадобиться добавить rxjs-compat для решения проблемы. Поэтому я добавил rxjs-compat в пример StackBlitz e вуаля! Ошибка исчезла.

Поэтому я подумал, что если я добавлю пакет в свой проект, я могу ожидать аналогичных результатов. Нету!

Не уверен, как решить проблему. Я связался со 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();
  }
}

1 Ответ

0 голосов
/ 12 января 2019

Как сказал @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()
   )
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...