Метод расширения машинописи Angular6 Observable <T> - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь сделать метод расширения в Observable

import { Observable } from 'rxjs/Observable';

declare module 'rxjs/Observable' {
  interface Observable<T> {
    customFilter<T>(this: Observable<T>): Observable<T>;
  }
}

function customFilter<T>(this: Observable<T>) {
  return this;
}

Observable.prototype.customFilter = customFilter;

Hoverver Я всегда получаю ошибку компиляции

ERROR in src/app/utils/observable.extensions.ts(13,1): error TS2693: 'Observable' only refers to a type, but is being used as a value here.

Вот мой tsconfig.app.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "module": "es6",
    "types": [],
    "paths": {
      "@angular/*": [
        "../node_modules/@angular/*"
      ]
    }
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}

Есть идеи?

1 Ответ

0 голосов
/ 27 октября 2018

Это тонкий. Модуль rxjs/Observable содержит:

export * from 'rxjs-compat/Observable';

Ваше расширение экспортированного интерфейса с именем Observable блокирует оператор export * от повторного экспорта Observable из rxjs-compat/Observable, как если бы export interface Observable<T> { ... } было записано непосредственно в модуле rxjs/Observable. (Может быть, компилятор должен сообщить об ошибке, когда это произойдет. В какой-то момент была проблема об этом открыто, но он был закрыт без четкого заявления о том, почему об ошибке нельзя было сообщить.) Как следовательно, единственное определение Observable, экспортированное из rxjs/Observable, - это интерфейс в вашем дополнении; значение не доступно.

Исправление: измените ваше увеличение на цель rxjs/internal/Observable (где первоначально объявлен класс Observable) вместо rxjs/Observable, чтобы ваш интерфейс правильно сливался с исходным классом.

...