在nodejs中导入TypeScript模块

时间:2012-10-18 15:42:13

标签: node.js typescript

使用typescript导入nodejs中的模块的最佳做法是什么?我来自c#background所以我想做这样的事情

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

Point将类分隔为多个.ts文件(最好每个类一个文件)。所以问题是,这是怎么做到的?

3 个答案:

答案 0 :(得分: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 :(得分:2)

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

答案 2 :(得分:1)

我建议不要使用明确的module(或namespace)关键字,它是早期的残留物。*您通常不需要它们,因为任何带有top-的打字稿文件级别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关键字的一般规则有例外,但不要首先关注它们。想想 file == module