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

Bre*_*ent 23 typescript

假设我想每个.ts文件有一个类.我有两个.ts文件,看起来像这样:

export module MyClasses { export class A {} }
Run Code Online (Sandbox Code Playgroud)

export module MyClasses { export class B {} }
Run Code Online (Sandbox Code Playgroud)

我不能这样做:

import MyClasses = module('A');
import MyClasses = module('B');
Run Code Online (Sandbox Code Playgroud)

如何在单独的文件中定义类并将它们放在同一个"命名空间"中?此外,我们最终必须做以下事情:

MyClasses.MyClasses.A
Run Code Online (Sandbox Code Playgroud)

代替

MyClasses.A
Run Code Online (Sandbox Code Playgroud)

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

import AModule = module('A');
module MyClasses{ var A = AModule.A; }
import BModule = module('B');
module MyClasses { var B = BModule.B; }
Run Code Online (Sandbox Code Playgroud)

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

Wol*_*ang 9

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

文件'Controllers/MainController.ts':

class MainController {
    ...
}

export = MainController;
Run Code Online (Sandbox Code Playgroud)

文件'Controllers/SecondController.ts':

class SecondController {
    ...
}

export = SecondController;
Run Code Online (Sandbox Code Playgroud)

文件'Controllers/Namespace.ts':

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

export = { MainController, SecondController }
Run Code Online (Sandbox Code Playgroud)

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

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

angular.module('app', [])
    .controller('MainController', Controllers.MainController)
    .controller('SecondController', Controllers.SecondController)
Run Code Online (Sandbox Code Playgroud)

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


Fen*_*ton 1

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

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

x.MyClasses.A;
y.MyClasses.B;
Run Code Online (Sandbox Code Playgroud)

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

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

var x = MyClasses.A;
Run Code Online (Sandbox Code Playgroud)