如何在TypeScript中将多个外部模块放入同一个命名空间?

时间:2012-10-14 13:38:15

标签: typescript

说我希望每个.ts文件有一个类。我有两个.ts文件,看起来像这样:

export module MyClasses { export class A {} }

export module MyClasses { export class B {} }

我不能这样做:

import MyClasses = module('A');
import MyClasses = module('B');

如何在单独的文件中定义类并将它们放在同一个“命名空间”中?此外,我们最终还是要做一些事情:

MyClasses.MyClasses.A

而不是

MyClasses.A

这种额外的层次结构有什么意义?这样你就可以在模块文件中有多个导出的模块?到目前为止,我已经弄清楚的最好的解决方案是删除“导出模块”(因为编译AMD时“导出类”似乎已经足够了),这会使类升级到一个层次级别。然后:

import AModule = module('A');
module MyClasses{ var A = AModule.A; }
import BModule = module('B');
module MyClasses { var B = BModule.B; }

尽管它完美无缺,但它并不完全简洁。有没有更好的方法来做到这一点?

3 个答案:

答案 0 :(得分:9)

不幸的是,似乎没有一个完美的解决方案,但这就是我现在解决的问题:

文件'Controllers / MainController.ts':

class MainController {
    ...
}

export = MainController;

文件'Controllers / SecondController.ts':

class SecondController {
    ...
}

export = SecondController;

文件'Controllers / Namespace.ts':

import MainController = require('./MainController');
import SecondController = require('./SecondController');

export = { MainController, SecondController }

文件'App.ts'(使用'命名空间')

import Controllers = require('Controllers/Namespace');

angular.module('app', [])
    .controller('MainController', Controllers.MainController)
    .controller('SecondController', Controllers.SecondController)

这为你提供了很好的intellisense,隐藏了400个import语句,并保留了实际使用命名空间的代码非常干净......

答案 1 :(得分:3)

我认为使用外部模块实现这一目标并不是更好的方法。语言规范定义外部模块如下:

  

外部模块(第9.4节)是使用外部模块名称引用的单独加载的代码体。外部模块被编写为一个单独的源文件,其中至少包含一个导入或导出声明。

更进一步说,内部模块是开放式的,可以扩展到多个文件:

  

内部模块是“开放式”的,内部模块声明与相对于公共根的相同限定名称(如2.2节中所定义)对单个模块有贡献。

我没有发现外部模块的类似声明。我非常相信它不是。如果您需要加载模块,那么您将不得不使用参考路径来访问从不同文件加载的类型。

然而,对我而言,听起来你最好选择内部模块。然后,您可以简单地将模块分散到两个文件

export module MyClasses { export class A {} }

export module MyClasses { export class B {} }

将它们带入参考路径的范围

///<reference path='A.ts'/>
///<reference path='B.ts'/>

然后简单地用模块名称引用它们,例如例如

var a = new MyClasses.A();

答案 2 :(得分:1)

请原谅可怜的变量名,我在Visual Studio中对此进行了测试。当我为import语句使用不同的名称时,它适用于我。

import x = module('A');
import y = module('B');

x.MyClasses.A;
y.MyClasses.B;

或者,您可以使用引用注释来获得类似的效果,但是如果要捆绑,则更好,而不是使用模块加载。您需要从两个export声明中删除MyClasses关键字:

///<reference path='A.ts'/>
///<reference path='B.ts'/>

var x = MyClasses.A;