说我希望每个.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; }
尽管它完美无缺,但它并不完全简洁。有没有更好的方法来做到这一点?
答案 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;