2012-10-18 144 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关键字的一般规则,但不要集中在他们开始。认为文件==模块