[英]How do I dynamically export Class methods as standalone functions in TypeScript?
I am rewriting an old NPM module in TypeScript, and I ran into an interesting problem. 我在TypeScript中重写一个旧的NPM模块,我遇到了一个有趣的问题。
The module, in its current state, looks like this - 该模块在当前状态下看起来像这样 -
1.1 my-module.js 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 1.2 example.js
var m = require('my-module');
m.init({thing: 'doodad'});
m.doStuff('bwoah');
I'm rewriting this in TS (targeting ES6), and plan to write the module as a class that can take a constructor (in lieu of init()
), letting me write nice things like - 我在TS中重写这个(针对ES6),并计划将模块编写为一个可以接受构造函数(代替init()
)的类,让我写出像 -
1.3 example-new.js 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.
The rewritten TypeScript module looks like this - 重写的TypeScript模块看起来像这样 -
1.4 my-module-new.js 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) {
// ...
}
}
What I'd like to achieve 我想要实现的目标
I want to maintain full backwards-compatibility with the old API as well. 我还希望保持与旧API的完全向后兼容性。 So ideally, I should be able to do both 1.2 and 1.3 . 理想情况下,我应该能够做到1.2和1.3 。
What I've tried so far 到目前为止我尝试过的
export
ing the Thing
class; export
Thing
班; this lets me do 1.3, but not 1.2. 这让我做1.3,但不是1.2。 export
ing a singleton, with export default new Thing()
; export
单例, export default new Thing()
; this lets me do 1.3, but not 1.2. 这让我做1.3,但不是1.2。 Writing something like this - 写这样的东西 -
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); }
This works well with both 1.2 and 1.3 - but this seems tedious to basically duplicate each function. 这适用于1.2和1.3 - 但基本上复制每个函数似乎很乏味。
Surely there must be a more elegant way of doing this? 当然必须有更优雅的方式来做到这一点?
Yes, we can! 我们可以! © In "Thing" file combine default export
and export
: ©在“Thing”文件中组合default export
和export
:
export class Thing {
init() { }
}
export default new Thing();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.