23

假设我想每个 .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; }

虽然它工作得很好,但并不完全简洁。没有更好的方法来做到这一点吗?

4

3 回答 3

10

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

文件“控制器/MainController.ts”:

class MainController {
    ...
}

export = MainController;

文件“控制器/SecondController.ts”:

class SecondController {
    ...
}

export = SecondController;

文件“控制器/命名空间.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)

这为您提供了很好的智能感知,隐藏了 400 个导入语句,并使实际使用命名空间的代码保持相当干净......

于 2015-10-21T13:56:33.563 回答
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();
于 2012-10-14T16:35:02.450 回答
1

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

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;
于 2012-10-14T16:16:27.543 回答