在nodejs中导入TypeScript模块

use*_*840 21 node.js typescript

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

MyClass.ts

module MyNamespace {
    export class MyClass {
    }
}
Run Code Online (Sandbox Code Playgroud)

app.ts

// something like using MyNamespace
new MyNamespace.MyClass();
Run Code Online (Sandbox Code Playgroud)

要么

MyClass.ts

export class MyClass {
}
Run Code Online (Sandbox Code Playgroud)

app.ts

import MyClass = module("MyClass")
new MyClass();
Run Code Online (Sandbox Code Playgroud)

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

import MyClass2 = module("MyClass")
new MyClass2.MyClass();
Run Code Online (Sandbox Code Playgroud)

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

Val*_*tin 15

你有两个选择:

如果您坚持使用CommonJS或AMD模块,则必须按照您在问题中描述的方式使用外部模块.是否使用模块声明自己的命名空间主要是品味问题.避免指定两个名称的问题的唯一方法是创建一个别名类型的变量:

mymodule.ts

export module MyNamespace {
    export class MyClass {
    }
}
Run Code Online (Sandbox Code Playgroud)

app.ts

import ns = require('mymodule');
var myclass = new ns.MyNamespace.MyClass();
var myclassalias = ns.MyNamespace.MyClass;
var myclass2 = new myclassalias();
Run Code Online (Sandbox Code Playgroud)

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

mymodule.ts

module MyNamespace {
    export class MyClass {
    }
}
Run Code Online (Sandbox Code Playgroud)

app.ts

///<reference path='mymodule.ts'/>
var myclass = new MyNamespace.MyClass();
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么这里没有提到打字稿?https://github.com/eknkc/typescript-require (2认同)