2017-04-06 70 views
0

我正在用TypeScript重写一个旧的NPM模块,并且遇到了一个有趣的问题。如何在TypeScript中动态地将Class方法导出为独立函数?

的模块,在其目前的状态,看起来是这样的 -

1.1我-module.js

export function init(options) { 
    //initialize module 
} 

export function doStuff(params) { 
    //do stuff with options and other things 
} 

1.2example.js

var m = require('my-module'); 
m.init({thing: 'doodad'}); 
m.doStuff('bwoah'); 

我是在TS(目标ES6)重写本,并计划写的模块,可以采取一个构造函数(代替init())一类的,让我写得真好之类的东西 -

1.3例如,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. 

重写的打字稿模块看起来是这样的 -

1.4我模块,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

什么我试过到目前为止

  1. export荷兰国际集团的Thing类;这让我做1.3,但不是1.2。
  2. export ing单身人士,与export default new Thing();这让我做1.3,但不是1.2。
  3. 写这样的事情 -

    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

是的,我们可以! ©“东西”文件合并default exportexport

export class Thing { 
    init() { } 
} 

export default new Thing(); 
相关问题