Typescript:从另一个模块的类中添加一个方法/从不同模块填充一个名称空间
故事
我正在build立一个math运算模块库。 我也想把这个库分成多个模块: core
, relational
, vectors
等等。 这些模块可以单独使用(但都取决于core
模块)
- 我知道这是不可能使用部分类如何将TypeScript类分成多个文件? / https://github.com/Microsoft/TypeScript/issues/563
问题 :
core
模块定义了Set
类,它是一个math集。 它定义了诸如Set#add
, Set#remove
。
但是, 可选的 relational
模块在Set
类上添加了Set#product
运算符。
其他模块也可以在Set
类中添加其他操作。 我想保持添加function的可能性,当我看到适合。
这个问题
-
使用打字稿 ,我怎样才能添加一个方法在另一个模块居住的类?
-
我如何安排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
奖金的问题
所有这些模块都可以通过一个通用的命名空间来使用,我们称之为MyLibrary
。 core
模块添加MyLibrary.Core
, relational
模块将一些对象添加到MyLibrary.Core
,并添加MyLibrary.Relational
。
比方说,我发布另一个模块,只用作其他模块的外观。 我们称之为模块my-library
。
如果用户使用npm安装my-library
, core
和relational
模块。
npm install my-library && npm install core and nom-install relational
在客户端应用程序中,我希望库的用户只需写入
var lib = require('my-library');
然后,我的库会自动检查所有已安装的MyLibrary模块,需要它们并填充MyLibrary命名空间并返回它。
在节点和浏览器环境中, my-library
如何告诉my-library
模块,第一次访问它
- 检查任何可用的MyLibrary模块(浏览器和节点环境)
- 为每个模块运行一个方法(将它们安装在命名空间中)
- 返回这个漂亮的水果命名空间
如果你只是写声明文件,你可以使用接口,而不是像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
自动得到新的方法。
- 使用cxsd将.xsd转换为TypeScript,不能识别cxsd
- 打字稿丢失信息模块加载w /没有.dts文件
- Typescript生成的JavaScript有一个不是函数的函数
- 无法在同一个TypeScript项目中使用requireJS和Node的Require
- BigNumber的TypeScripttypes定义
- npm start不会打开浏览器选项卡
- Angular 4 CanActivate guard不会加载与服务一起使用的组件; 简单的Observable.of(true)作品
- 导入http = require('http'); 并从http导入*作为http;
- string原型在浏览器中工作,但不在节点中