22

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

MyClass.ts

module MyNamespace {
    export class MyClass {
    }
}

应用程序.ts

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

或者

MyClass.ts

export class MyClass {
}

应用程序.ts

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

我知道我可以做到这一点并且它会起作用,但是我必须为每个班级想出两个名字

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

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

4

3 回答 3

16

您在这里有两个选择:

如果您坚持使用 CommonJS 或 AMD 模块,那么您将不得不按照您在问题中描述的方式使用外部模块。是否使用模块来声明自己的命名空间主要是个人喜好问题。避免指定两个名称问题的唯一方法是创建一个为该类型起别名的变量:

我的模块.ts

export module MyNamespace {
    export class MyClass {
    }
}

应用程序.ts

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

您的另一个选择是使用内部模块,这些模块主要用于在内部构建您的代码。内部模块在编译时使用引用路径进入范围。

我的模块.ts

module MyNamespace {
    export class MyClass {
    }
}

应用程序.ts

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

我认为您必须自己决定这两种方法中的哪一种更合适。

于 2012-10-18T16:06:22.970 回答
2

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

于 2013-01-02T01:05:45.483 回答
2

我建议不要使用显式module(或namespace)关键字,它是早期的遗迹。*您通常不需要它们,因为任何具有顶级importexport自动模块的打字稿文件。您的第二个myModule.ts示例很好。

export class MyClass {
   ...
}

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

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

就个人而言,我不喜欢第 1 行的重复,但这是语言所要求的,所以我学会了接受它。我认为除非您放弃 file-per-class 模式,否则这种语法的实用性并不明显。您选择从模块中导入的名称,这样就不会发生意外的命名空间污染。

另一种导入语法从模块中提取所有名称,但在使用它们时必须使用模块限定名称。因此它也具有抗碰撞的名称。

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

关于不需要module/namespace关键字的一般规则有例外,但不要从关注它们开始。想想文件 == 模块

于 2017-05-19T03:36:26.610 回答