Angular6 打字稿扩展方法 Observable<T>

Rap*_*aël 2 extension-methods typescript angular6

我正在尝试在 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;
Run Code Online (Sandbox Code Playgroud)

但是我总是收到编译错误

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.
Run Code Online (Sandbox Code Playgroud)

这是我的 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"
  ]
}
Run Code Online (Sandbox Code Playgroud)

任何的想法 ?

Mat*_*hen 5

这是一个微妙的。该rxjs/Observable模块包含:

export * from 'rxjs-compat/Observable';
Run Code Online (Sandbox Code Playgroud)

您导出接口的增强命名Observable挡住了export *从转口声明Observablerxjs-compat/Observable,就好像export interface Observable<T> { ... }已经中直接写入rxjs/Observable模块。(也许编译器在发生这种情况时应该报告错误。曾经有一个关于此的问题,但它在没有明确说明为什么无法报告错误的情况下关闭。)因此,唯一的定义是Observable导出的rxjs/Observable是您的增强中的接口;没有价值意义。

解决方法是将您的扩充更改为 target rxjs/internal/ObservableObservable最初声明类的位置)而不是rxjs/Observable,以便您的界面与原始类正确合并。