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

标签 javascript typescript static rxjs rxjs5

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

var myStaticFn = function() { /* ... */ };
Observable.myStaticFn = myStaticFn;

这可行,但在 TypeScript 中我无法访问 Observable.myStaticFn,因为属性 myStaticFnObservable 类中未知。

如何声明/扩充 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/

相关文章:

javascript - 如何使用 Webstorm IDE 在 Typescript 项目中引用多个接口(interface)文件?

typescript - 如何在 Typescript 中实例化 File 对象?

C# 无法访问静态上下文中的非静态成员字段,实际上不在静态上下文中

python - 在 Django 中添加静态 html 页面

javascript - "if"验证表单的语句无法正常工作

javascript - 当路由参数和地址无效时,Angular 2不会重定向到404页面

javascript - 全屏背景图像 + 旋转图像?

java - 静态方法不能运行其他方法吗?

javascript - 查找与条件匹配的数组索引,然后插入另一个数组

asp.net - 返回 404 错误的脚本文件