在TypeScript中以类型安全的方式用静态函数从外部库扩展一个类
Extend a class from an external library with a static function in a typesafe manner in TypeScript
我想用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
当作一个接口,接口可以被增强/合并。但是在TypeScript中没有办法在接口上声明一个static函数。
从Observable
类派生也不可行,说ExtendedObservable
,因为我的代码的每个用户都必须在整个项目中使用ExtendedObservable
类型而不是Observable
类型,如果我想在Observable上放置不同的静态方法,这个概念也会失败,这取决于导入的模块。
我在查看RxJS源代码中静态.from()
扩展的实现时发现了这一点:
import { myStaticFn as myStaticFnStatic } from "./myStaticFn";
declare module "rxjs/Observable" {
namespace Observable {
let myStaticFn: myStaticFnStatic;
}
}
请注意我是如何导入myStaticFn
的,但它在本地的范围为myStaticFnStatic
-这是必需的,否则你会得到一个编译器错误。
在rx的定义文件中有Observable类和ObservableStatic的定义。
如果你想添加静态函数,那么你需要增加ObservableStatic
:
declare module "rxjs/Observable" {
interface ObservableStatic {
myOperator: typeof myOperator;
}
}
您需要声明一个与接口同名的模块。在模块内部编写静态函数。这是TypeScript的最佳实践。这叫做"模块合并"。
参考:Pro TypeScript pages #40 #41
只有一个注意事项:自本书撰写以来,微软已将术语"内部模块"更改为"命名空间":
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 在这个使用hasOwnProperty的对象扩展程序中有一个错误,I'我不确定那个bug是什么,也不确定这个扩展
- 打开一个选项卡,并在firefox网络扩展中向其发出POST请求
- 制作一个chrome扩展,替换css和js元素
- Chrome扩展和Angular:我可以把Chrome.runtime.sendMessage变成一个同步函数吗
- Firefox扩展开发:如何在内容脚本中创建一个全局函数,以便其他加载的脚本文件可以访问它
- 扩展在LeafletJS中是如何工作的,为什么我需要一个中介归因才能使其正确工作
- Jquery:扩展一个对象来修改一个方法
- jQuery从数组扩展一个json元素
- 为什么必须扩展一个对象才能删除它的成员?
- 扩展一个节点,直到它的子节点有一个兄弟节点
- 在TypeScript中以类型安全的方式用静态函数从外部库扩展一个类
- 扩展一个表单的高度以适应表单中的内容
- 扩展一个函数——合并两个函数
- 您是否可以用一个也可以访问这些私有属性的函数来扩展一个可以访问私有属性的对象?
- 我需要匹配和扩展一个小的url与javascript
- 扩展一个函数并对其进行实例化-javascript
- 扩展一个javascript(nodeJS)对象,该对象没有'尚未创建
- 在js中用程序扩展一个可折叠的集合
- 什么是最简单的js代码,我需要扩展一个悬停显示块,所以它仍然在那里一秒钟