在nodejs中inputTypeScript模块

使用打字机在nodejs中导入模块的最佳做法是什么? 我来自C#背景,所以我想要做这样的事情

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

我知道我可以做到这一点,它会起作用,但是我必须为每个class级考虑两个名字

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

Point将类分隔为多个.ts文件(最好每个类一个文件)。 所以问题是,这是如何完成的?

你有两个select:

如果你坚持使用CommonJS或AMD模块,那么你将不得不使用外部模块,就像你在问题中描述的那样。 不pipe你是否使用一个模块来声明你自己的命名空间大多是一个品味的问题。 规避两个名字的唯一方法是创build一个variables来replacetypes:

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

您的其他select是使用内部模块,这些模块主要用于在内部构build您的代码。 内部模块在编译时使用参考path进入范围。

mymodule.ts

 module MyNamespace { export class MyClass { } } 

app.ts

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

我认为你必须自己决定哪种方法更合适。

您可以使用为此特定目的创build的typescript-require模块将TypeScript模块导入到node.js文件中。

我build议不要使用明确的module (或namespace )关键字,这是一个更早的时间遗留下来的残留*。通常不需要它们,因为任何具有顶级importexport打印文件自动是一个模块。 你的第二个myModule.ts例子很好。

 export class MyClass { ... } 

但是当你把它导入到另一个打字稿模块时,你会想用这样的东西:

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

就个人而言,我不喜欢重复第一行,但这是语言所要求的,所以我学会了接受它。 我认为这种语法的效用是不明显的,除非你放弃每类文件的模式。 您可以从模块中select要导入的名称,以免发生意外的名称空间污染。

另一种导入语法从模块中提取所有名称,但是在使用模块时必须使用模块限定名称。 所以它也是名字碰撞抵抗。

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

关于不需要module / namespace关键字的一般规则也有例外,但不要着眼于它们。 认为文件==模块