在Nodejs中导入TypeScript模块

25

在使用TypeScript的Node.js中,导入模块的最佳实践是什么?我来自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();

我知道这样做会起作用,但我需要为每个类想出两个名称。

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

问题是将类分离到多个 .ts 文件中(最好每个类一个文件)。那么问题是,如何实现?

3个回答

16

这里有两个选择:

如果您坚持使用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和Node.js,那么在这种情况下我该如何采用第二种方法呢?我需要使用某些单独的工具将所有文件合并成一个.js文件吗?而在浏览器中,我是否只需将每个.js文件添加到<script>标签中即可? - user1756840
2
为什么这里没有提到typescript-require?https://github.com/eknkc/typescript-require - Anderson Green

3
你可以使用typescript-require模块将TypeScript模块导入到node.js文件中,该模块专为此目的而创建。

2

我建议不要使用显式的module(或namespace)关键字,它是早期遗留下来的痕迹。你通常不需要它们,因为任何带有顶级importexport的typescript文件都会自动成为一个模块。你第二个myModule.ts示例很好。

export class MyClass {
   ...
}

但是当你在另一个 TypeScript 模块中导入它时,你需要使用类似这样的代码:
import { MyClass } from './myModule';
var myInstance = new MyClass();

个人而言,我不喜欢第一行的重复性,但这是语言所要求的,所以我已经学会接受它了。我认为,除非放弃每个类一个文件的模式,否则这种语法的实用性并不明显。你可以从模块中挑选和选择要导入的名称,以避免意外的命名空间污染。

另一种导入语法会从模块中引入所有名称,但在使用时必须用模块限定名称。因此,它也具有名称冲突防止的功能。

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

通常情况下不需要使用module / namespace关键字,但是有一些例外,请不要首先关注这些例外。把文件看做是模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接