2012-10-18 202 views
20

使用打字機在nodejs中導入模塊的最佳做法是什麼?我來自C#背景,因此我想要做這樣的事情nodejs中的TypeScript模塊導入

MyClass.ts

module MyNamespace { 
    export class MyClass { 
    } 
} 

app.ts

// something like using MyNamespace 
new MyNamespace.MyClass(); 

MyClass.ts

export class MyClass { 
} 

app.ts

import MyClass = module("MyClass") 
new MyClass(); 

我知道我能做到這一點,它會工作,但後來我想出了兩個名稱爲每個類

import MyClass2 = module("MyClass") 
new MyClass2.MyClass(); 

點將類分隔爲多個.ts文件(最好每個類一個文件)。所以問題是,這是如何完成的?

回答

15

你有兩個選擇:

如果您堅持使用CommonJS的或AMD模塊,那麼你將不得不使用外部模塊只是你在你的問題中描述的方式。無論您是否使用模塊來聲明自己的名稱空間,大部分都是品味的問題。規避指定兩個名稱問題的唯一方法是創建別名類型的變量:

mymodule.ts

export module MyNamespace { 
    export class MyClass { 
    } 
} 

app.ts

import ns = require('mymodule'); 
var myclass = new ns.MyNamespace.MyClass(); 
var myclassalias = ns.MyNamespace.MyClass; 
var myclass2 = new myclassalias(); 

你其他選項是使用內部模塊,這些模塊主要用於內部構建您的代碼。在編譯時使用參考路徑將內部模塊納入範圍。

mymodule.ts

module MyNamespace { 
    export class MyClass { 
    } 
} 

app.ts

///<reference path='mymodule.ts'/> 
var myclass = new MyNamespace.MyClass(); 

我認爲你必須自己決定這兩種方法中的哪個更合適。

+1

那麼第二種方法看起來不錯。但目前我正在使用visual studio和nodejs,在這種情況下,我應該如何處理第二種方法,是否必須將所有文件(通過一些單獨的工具)合併到一個.js中?如果是瀏覽器,我應該只添加每個.js到

2

您可以導入打字稿模塊插入使用typescript-require模塊,這是爲這一特定目的創建的node.js文件。

0

我會建議不要使用顯式module(或namespace)關鍵字,它是一個較早的時間一殘剩。*您一般不需要它們,因爲有一個頂級的任何打字稿文件importexport自動一個是模塊。你的第二個myModule.ts的例子很好。

export class MyClass { 
    ... 
} 

但是當你把它導入到另一個打字稿模塊,你要使用這樣的:

import { MyClass } from './myModule'; 
var myInstance = new MyClass(); 

就個人而言,我不喜歡1號線的重複性,但它是什麼語言要求,所以我學會了接受它。我認爲這種語法的效用並不明顯,除非你放棄每類文件模式。您可以從模塊中選擇要導入的名稱,以免發生意外的名稱空間污染。

另一種導入語法從模塊中提取所有名稱,但在使用模塊時必須使用模塊限定名稱。因此它也是名稱碰撞抵抗。

import * as myModule from './myModule'; 
var myInstance = new myModule.MyClass(); 

也有例外約不需要module/namespace關鍵字的一般規則,但不要集中在他們開始。認爲文件==模塊