我想用 static 函数扩展 rxjs5 Observable
类。我可以用纯 JavaScript 做到这一点:
var myStaticFn = function() { /* ... */ };
Observable.myStaticFn = myStaticFn;
这可行,但在 TypeScript 中我无法访问 Observable.myStaticFn
,因为属性 myStaticFn
在 Observable
类中未知。
如何声明/扩充 rxjs5 模块 Observable
类,以便我可以以类型安全的方式访问我的函数?
注意:作为起点,以下示例展示了如何将非静态 函数扩展到 Observable(例如创建自定义 rxjs 运算符),这完全有效,但不是我想要的!
function myOperator(this: Observable<any>): Observable<any> = function(){ /*...*/ };
Observable.prototype.myOperator = myOperator;
declare module "rxjs/Observable" {
interface Observable<T> {
myOperator: typeof myOperator;
}
}
以上是可行的,因为 TypeScript 的 declare
语法允许我将 Observable
视为一个接口(interface),并且接口(interface)可以被扩充/合并。但是在 TypeScript 中没有办法在接口(interface)上声明一个static函数。
从 Observable
类派生也是不可行的,比如 ExtendedObservable
因为我的代码的每个用户都必须使用 ExtendedObservable
类型而不是整个项目中的 Observable
类型,如果我想根据导入的模块在 Observable 上放置不同的静态方法,这个概念也会失败。
最佳答案
我自己找的at the implementation of the static .from()
extension in the RxJS source :
import { myStaticFn as myStaticFnStatic } from "./myStaticFn";
declare module "rxjs/Observable" {
namespace Observable {
let myStaticFn: myStaticFnStatic;
}
}
请注意我是如何导入 myStaticFn
但在本地将其限定为名称 myStaticFnStatic
- 这是必需的,否则会出现编译错误。
关于javascript - 在 TypeScript 中以类型安全的方式使用静态函数从外部库扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40020557/