首页 文章

在nodejs中导入TypeScript模块

提问于
浏览
21

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

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

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

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

3 回答

  • 1

    你有两个选择:

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

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

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

    mymodule.ts

    module MyNamespace {
        export class MyClass {
        }
    }
    

    app.ts

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

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

  • 15

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

  • 2

    我建议不要使用显式 module (或 namespace )关键字,它需要它们,因为任何带有顶级 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 关键字的一般规则有例外,但不要从关注它们开始 . 想想文件==模块 .

相关问题