我可以在Node.js / Express中动态导入TypeScript模块吗?

时间:2017-03-27 20:44:49

标签: javascript node.js express typescript sequelize.js

我有一个使用Express.js构建的Node.js服务器,并使用TypeScript编码。这是我的服务器的get调用片段:

server.ts

private get(req: Request, res: Response, next: NextFunction, objectName: string) {
    var DatabaseObject = require("./models/" + objectName + ".js")(this.orm, Sequelize.DataTypes);
    var Transform = require("./routes/" + objectName + ".js");
    var transform = new Transform();

    // ...

    console.log(req.query["columns"]);
    console.log(transform.columnWhitelist);
    console.log(transform);

    // ...

    if (transform.columnWhitelist) {
        console.log("Column Whitelist Exists.");
    }
    // ...
}

它为URL中请求的数据库对象动态加载Sequelize模块,然后尝试加载TypeScript模块,其中包含可以选择哪些列的规则,可以查询哪些列等。这是我的规则集的开头类:

account.ts

export default class Transform {
    static columnWhitelist : Object = {"id": "id", "name": "name", "parentAccountId":"parentAccountId", "masterAccountId":"masterAccountId"};

    constructor() { }
}

然而,运行我的应用程序,我得到:

id,name,parentAccountId
undefined
{ default: 
   { [Function: Transform]
     columnWhitelist: 
      { id: 'id',
        name: 'name',
        parentAccountId: 'parentAccountId',
        masterAccountId: 'masterAccountId' } } }

调用transform.columnWhitelist,我得到了未定义,尽管在生成的JavaScript文件中也看到了它。我也尝试过:

    var transform = require("./routes/" + objectName + ".js");

或者:

    var transform = require("./routes/" + objectName + ".js")();

但这些都不起作用。

2 个答案:

答案 0 :(得分:3)

如果你的tsconfig.json中有一个commonjs作为模块,而且默认情况下导出的是Transform类,你应该将其导入为

 var transform = require("./routes/" + objectName + ".js").default;

答案 1 :(得分:0)

如果您不想使用

var transform = require("./routes/" + objectName + ".js").default;

您可以通过

导出课程
class Transform {
     static columnWhitelist: Object = {"id": "id", "name": "name", "parentAccountId": "parentAccountId", "masterAccountId": "masterAccountId"};

     constructor () {}
}

export = Transform;

你可以像以前一样再做一次:

var transform = require ("./ routes /" + objectName + ".js");