我在TypeScript中重写一个旧的NPM模块,我遇到了一个有趣的问题。
该模块在当前状态下看起来像这样 -
1.1 my-module.js
export function init(options) {
//initialize module
}
export function doStuff(params) {
//do stuff with options and other things
}
1.2 example.js
var m = require('my-module');
m.init({thing: 'doodad'});
m.doStuff('bwoah');
我在TS中重写(针对ES6),并计划将模块编写为一个可以采用构造函数(代替init()
)的类,让我写出像 - < / p>
1.3 example-new.js
import {Thing} from 'my-module';
const aThing1 = new Thing({thing: 'doodad'});
const aThing2 = new Thing();
aThing2.init({thing: 'doodad'});
aThing1.doStuff('bwoah');
aThing2.doStuff('bwoah');
// If I can do at least one of aThing1 or aThing2, I can die a happy man.
重写的TypeScript模块如下所示 -
1.4 my-module-new.js
class Thing {
options: Object;
constructor(options: Object) {
this.options = options;
}
init(options: Object) {
this.options = options;
return this;
}
doStuff(thingForStuff: string) {
// ...
}
}
我想要实现的目标
我还希望保持与旧API的完全向后兼容性。理想情况下,我应该能够 1.2和1.3 。
到目前为止我尝试了什么
export
Thing
班级;这让我做1.3,但不是1.2。export
单身,export default new Thing()
;这让我做1.3,但不是1.2。写这样的东西 -
export class Thing {
options: Object;
constructor(options: Object) {
this.options = options;
}
init(options: Object) {
this.options = options;
return this;
}
doStuff(thingForStuff: string) {
// ...
}
}
const singleThing = new Thing();
export function init(options) {
return singleThing.init(options);
}
export function doStuff(string) {
return singleThing.doStuff(string);
}
这适用于1.2和1.3 - 但基本上复制每个函数似乎很乏味。
当然必须有一种更优雅的方式吗?
答案 0 :(得分:0)
是的,我们可以! ©在“Thing”文件中合并default export
和export
:
export class Thing {
init() { }
}
export default new Thing();