在 TypeScript 中以类型安全的方式使用静态函数从外部库扩展类

Dyn*_*lon 2 javascript static rxjs typescript rxjs5

我想Observable静态函数扩展 rxjs5类。我可以用纯 JavaScript 做到这一点:

var myStaticFn = function() { /* ... */ };
Observable.myStaticFn = myStaticFn;
Run Code Online (Sandbox Code Playgroud)

这是有效的,但在 TypeScript 中我无法访问,Observable.myStaticFn因为myStaticFnclass 中不知道该属性Observable

如何声明/增强 rxjs5 ModuleObservable类,以便我可以以类型安全的方式访问我的函数?

注意:作为起点,下面展示了如何将非静态函数扩展到 Observable 的示例(例如创建自定义 rxjs Operator),这完全有效,但不是我想要的!

function myOperator(this: Observable<any>): Observable<any> = function(){ /*...*/ };
Observable.prototype.myOperator = myOperator;

declare module "rxjs/Observable" {
    interface Observable<T> {
        myOperator: typeof myOperator;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的方法是有效的,因为declareTypeScript的语法允许我把它Observable当作一个接口,并且接口可以被扩充/合并。但是 TypeScript 无法在接口上声明静态函数。

Observable类派生也是不可行的,ExtendedObservable因为我的代码的每个用户都必须ExtendedObservableObservable整个项目中使用类型而不是类型,如果我想在 Observable 上放置不同的静态方法,这个概念也会失败,具体取决于在导入的模块上。

Dyn*_*lon 8

我在查看RxJS 源代码中静态.from()扩展的实现时发现了这一点

import { myStaticFn as myStaticFnStatic } from "./myStaticFn";

declare module "rxjs/Observable" {
    namespace Observable {
        let myStaticFn: myStaticFnStatic;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意我如何导入myStaticFn但将其本地化为名称myStaticFnStatic- 这是必需的,否则会出现编译器错误。