Typescript:从另一个模块的类中添加一个方法/从不同模块填充一个名称空间

故事

我正在build立一个math运算模块库。 我也想把这个库分成多个模块: corerelationalvectors等等。 这些模块可以单独使用(但都取决于core模块)

  1. 我知道这是不可能使用部分类如何将TypeScript类分成多个文件? / https://github.com/Microsoft/TypeScript/issues/563

问题 :

core模块定义了Set类,它是一个math集。 它定义了诸如Set#addSet#remove

但是, 可选的 relational模块在Set类上添加了Set#product运算符。

其他模块也可以在Set类中添加其他操作。 我想保持添加function的可能性,当我看到适合。

这个问题

  1. 使用打字稿 ,我怎样才能添加一个方法在另一个模块居住的类?

  2. 我如何安排types,以便我的图书馆用户只有在安装了relational模块的情况下才能在代码完成中看到Set#product ? 否则,他只看到#add#remove操作?

我正在开发node.js这个库,但也使用browserify捆绑它的浏览器使用。

 // core/set.ts export class Set { add(element){} remove(element){} } // relational/set.ts import {Set} from './../core/set.ts'; Set.prototype.product = function(){} // ? // app/index.js import {core} from 'mylib'; var set = new Set(); set.add(); set.remove(); // set.product() is not available // app/index2.js import {core} from 'mylib'; import {relational} from 'mylib'; var set = new Set(); set.add(); set.remove(); set.product() //is available 

奖金的问题

所有这些模块都可以通过一个通用的命名空间来使用,我们称之为MyLibrarycore模块添加MyLibrary.Corerelational模块将一些对象添加到MyLibrary.Core ,并添加MyLibrary.Relational

比方说,我发布另一个模块,只用作其他模块的外观。 我们称之为模块my-library

如果用户使用npm安装my-librarycorerelational模块。

 npm install my-library && npm install core and nom-install relational 

在客户端应用程序中,我希望库的用户只需写入

 var lib = require('my-library'); 

然后,我的库会自动检查所有已安装的MyLibrary模块,需要它们并填充MyLibrary命名空间并返回它。

在节点和浏览器环境中, my-library如何告诉my-library模块,第一次访问它

  1. 检查任何可用的MyLibrary模块(浏览器和节点环境)
  2. 为每个模块运行一个方法(将它们安装在命名空间中)
  3. 返回这个漂亮的水果命名空间

如果你只是写声明文件,你可以使用接口,而不是像moment-timezone那样做。

moment.d.ts

 declare module moment { interface Moment { // ... } interface MomentStatic { // ... } } declare module 'moment' { var _tmp: moment.MomentStatic; export = _tmp; } 

那一刻,timezone.d.ts

只需重新声明具有额外function的相同接口即可。

 declare module moment { interface Moment { tz(): void; } interface MomentStatic { tz(): void; } } declare module 'moment-timezone' { var _tmp: moment.MomentStatic; export = _tmp; } 

两个软件包现在都是相同的,而且moment自动得到新的方法。