如何使用typescript的外部模块动态实例化

时间:2014-05-29 13:30:48

标签: javascript requirejs typescript require

我们开始在项目中使用requirejs并将所有内部模块转换为外部模块。

我在动态实现课程时遇到了问题。我们需要能够使用简单的点符号字符串来实现类。

当我们所有模块都是内部模块时,可以通过window对象访问它们。这是一个例子:

// file - TestAction.ts
module cb.action {
    export class TestAction {
        constructor() {}
    }
}

将以下函数与className =" cb.action.TestAction"一起使用我们可以轻松获得TestAction实例。

var instantiateByName = function (className) {
    "use strict";
    var ClassName2 = className.split('.').reduce(function (current, name) {
        return current[name];
    }, window);
    return new ClassName2();
    };

现在我们将所有模块更改为外部模块,TestAction.ts文件现在看起来像这样:

// file - TestAction.ts
export class TestAction {
    constructor() {}
}

2个主要问题:      - 根据我接收的点符号字符串,我需要导入不同的文件。 (动态需要一个文件)      - 我需要上面的instantiateByName函数的等价物,因为我不能再使用window对象了。

期待您的投入

1 个答案:

答案 0 :(得分:0)

我会略微更改模块结构(如果你每个文件使用一个类......)

class TestAction {
    constructor() {}
}

export = TestAction;

然后使用RequireJS iteself来代替使用方法按名称动态加载模块......

// Instead of 'instantiateByName'...
import TestAction = require('./action/TestAction');
var myAction = new TestAction();

这编译成以下内容......

define(["require", "exports", './action/TestAction'], function(require, exports, TestAction) {
    var myAction = new TestAction();
});

这处理了RequireJS异步加载脚本文件的事实。