故事
我正在构建一个用于数学运算的模块化库。我还想将库分为多个模块:核心
、关系
、向量
等。这些模块可以单独使用(但都依赖于 core
模块)
- 我知道不可能使用部分类 How do I split a TypeScript class into multiple files?/https://github.com/Microsoft/TypeScript/issues/563
问题:
core
模块定义了 Set
类,它是一个数学集合。它定义了Set#add
、Set#remove
等操作。
不过,可选关系
模块在Set
类上添加了一个Set#product
运算符。
其他模块也可以在 Set
类上添加其他操作。我希望保留在我认为合适时添加功能的可能性。
问题
使用 typescript,如何在驻留在另一个模块中的类上添加方法?
如何安排输入,以便我的库的用户仅在安装了
关系
模块时才能在其代码补全中看到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
奖励问题
所有这些模块都可以通过公共(public)命名空间使用,我们将其称为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');
然后,my-library 会自动检查所有已安装的 MyLibrary 模块,需要它们并填充 MyLibrary 命名空间并返回它。
我如何在 Node 和浏览器环境中第一次访问my-library
模块时告诉它
- 检查是否有任何可用的 MyLibrary 模块(浏览器和 Node 环境)
- 为每个模块运行一个方法(将它们安装在命名空间中)
- 返回那个漂亮的水果命名空间
最佳答案
如果您只是编写声明文件,则可以使用接口(interface)代替并执行类似 moment-timezone
的操作确实如此。
时刻.d.ts
declare module moment {
interface Moment {
// ...
}
interface MomentStatic {
// ...
}
}
declare module 'moment' {
var _tmp: moment.MomentStatic;
export = _tmp;
}
时刻时区.d.ts
只需重新声明具有额外功能的相同接口(interface)即可。
declare module moment {
interface Moment {
tz(): void;
}
interface MomentStatic {
tz(): void;
}
}
declare module 'moment-timezone' {
var _tmp: moment.MomentStatic;
export = _tmp;
}
两个包现在是相同的,并且 moment
自动获取新方法。
关于node.js - typescript : Add a method on a class from another module/Populate a namespace from different modules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34448251/