繁体   English   中英

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

[英]How do dynamically instantiate using typescript's external modules

我们开始在项目中使用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对象了。

期待您的意见

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

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异步加载脚本文件的事实。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM