2016-08-31 20 views
0

這裏的一個簡單問題是如何使用命名空間打字稿類作爲用於節點的外部模塊。這個問題的答案似乎是如何使用現有的打字稿命名空間類作爲nodejs的外部模塊

它不能做,不要嘗試,不要使用命名空間

我在,我們有一個大的代碼庫的位置那麼這都是用命名空間編寫的,我們現在也試圖在node.js中使用這些代碼。

我想弄清楚如何使用我們現有的代碼。

我已經得到儘可能編譯我的命名空間代碼,這樣產生一個js文件和一個d.ts每個ts文件CommonJS的nodelibs文件夾。

我有以下內容添加到我的每一個TS文件,我想提供給節點:

var entities = require("../nodelibs/entities/entities"); 

var myThing = new entities.SomeClass(); 

儘管:

namespace Organisation.Project.Entities{ 
    export class SomeThing{ 

    } 
} 

var module: {copy module definition from node.d.ts} 

if(module) 
{ 
    module.exports = Organisation.Project.Entities; 
} 

我可以在節點的應用程序使用此代碼有entities.jsentities.d.ts../nodelibs/entities/entities沒有類型信息或編譯時檢查SomeClass是一件事情。

我可以手動導入參考文件並手動鍵入類的實例,但在我的情況下SomeClass是一個有很多靜態的類,所以我不能打出如何正確地輸入它......

var entities = require("../nodelibs/entities/entities"); 

var classRef = entities.SomeClass; 

var myVar = classRef.staticProperty; 

在這個例子中,因爲它不是SomeClass一個實例,我不能爲SomeClass鍵入classRef,它是類的構造函數。 如何鍵入classRef以便我可以訪問類Some Class上的靜態屬性?

感謝

+0

也許用'import entities'而不是'var entities'? – Paleo

+0

導入出現各種錯誤,找不到模塊或實體.js不是有效的模塊... – Roaders

+0

在導入的文件'entities.ts'中,應該使用標準的靜態ES6語法:'export namespace Organisation.Project .Entities {/ * ... * /}'。之後,編譯器將能夠將其視爲有效的模塊。 – Paleo

回答

1

寫有ES6模塊

在模塊的代碼,使用靜態ES6 module syntax

// File entities.ts 
export namespace Organisation.Project.Entities { 
    export class SomeClass { 
     public static abc = 'abc'; 
    } 
} 

然後,導入您的命名空間:

// File main.ts 
import {Organisation} from './entities'; 
type classRef = Organisation.Project.Entities.SomeClass; 
var myVar = classRef.abc; 

編譯Node.js

說編譯器生成的CommonJS的格式模塊:

// File tsconfig.json 
{ 
    "compilerOptions": { 
     "module": "commonjs" 
    }, 
    "exclude": [ 
     "node_modules" 
    ] 
} 

編譯用於瀏覽器

在瀏覽器中,您可以使用捆綁或裝載機。有一些配置要做。

捆紮機:

裝載機:

+0

太近了!我認爲這是要解決它,但如果我添加導出到命名空間,那麼我不能編譯沒有模塊在瀏覽器中使用(與outFile指定)。這就是我們目前編譯我們的代碼庫的方式,全部集成到一個文件中。謝謝 – Roaders

+0

@Roaders:您可以使用打包程序(Webpack)或加載程序(SystemJS)來使用瀏覽器。我會編輯。 – Paleo

相關問題