2017-03-27 34 views
3

我有一个使用Express.js构建的Node.js服务器,并使用TypeScript编码。下面是get调用的对我的服务器的代码段:我可以在Node.js/Express中动态导入TypeScript模块吗?

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."); 
    } 
    // ... 
} 

它动态地加载数据库对象Sequelize模块所请求的URL,然后尝试加载与规则打字稿模块什么可以选择列,哪些列可以查询的,等等。这里是我的规则集类的开头:

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")(); 

但这些都不工作,要么。

回答

3

如果你在你的tsconfig.json CommonJS的一个模块,并变换导出为默认类你应该导入为

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

我现在明白了。非常感谢!有一点我试过'var Transform = require(“./ routes /”+ objectName +“.js”); var transform = Transform.Transform;'或类似的东西,但我必须输入错误的东西。 – NobleUplift

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"); 
+0

是'export = Transform;'TypeScript特定的语法与JavaScript的'module.exports = ...',还是写入后者的另一种方式? – NobleUplift

+0

** export = **用于给出打印机的**导出默认**行为。此外,它的工作原理与接口,功能,枚举等等 你可以找到更多的阅读文档 [https://www.typescriptlang.org/docs/handbook/modules.html](https:// www.typescriptlang.org/docs/handbook/modules.html)(你可以做出口的搜索=) 如果你想保持打字,你可以添加:VAR变换:变换的typeof =要求(” ./路线/ “+ objectName +”.js“); – nkweb