使用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文件(最好每个类一个文件)。所以问题是,这是怎么做到的?
答案 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-的打字稿文件级别import
或export
自动成为模块。你的第二个 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 。