2017-03-27 60 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