2016-04-25 99 views
1

我试图创建打字稿大角度的应用程序,我想我的应用程序奠定了具有下列文件夹结构:打字稿进口语法

./App
--- 控制器
--- HomeController.ts
--- SomeOtherController.ts
--- 指令
--- MyDirective.ts
--- app.ts

我还想要命名空间/模块,以便所有控制器都位于MyApp.Controllers命名空间中。所以在上面的例子中我有2个控制器模块:

MyApp.Controllers.HomeController
MyApp.Controllers.SomeOtherController

我设置了执行下列操作:

HomeController的。 TS

export module MyApp.Controllers { 
    export class HomeController { 
     ... 
    } 
} 

SomeOtherController.ts

export module MyApp.Controllers { 
    export class SomeOtherController { 
     ... 
    } 
} 
在app.ts

现在我想导入所有我的控制器,并且这是我遇到的问题,我尝试:

import * as Controllers from './controllers/HomeController' 

但随后访问控制器我有要做:

Controllers.MyApp.Controllers 

这是丑陋的。另外我如何从另一个文件获取控制器?理想情况下,我想导入名称空间“MyApp.Controllers”中的所有内容,并且无需在代码中添加MyApp.Controllers前缀即可使用它。

回答

3

您必须摆脱C#/ Java等语言惯用的思维方式,您可以使用命名空间来组织代码。 如果打字稿通过使用类似于您拥有文件夹和文件的文件系统的方法来组织您的代码。

  • 每个文件已经是一个模块 - 所以摆脱你的ts文件中的export module
  • 您将一个文件中的逻辑耦合类分组,理想情况下每个文件一个类。
  • 您可以将文件分组到文件夹中以进一步构建您的应用程序。
  • 你的情况

因此,移除export module后,你将使用的控制器是这样的:

import {HomeController} from './controllers/HomeController' 

希望这有助于。

+0

这有帮助!只是为了感兴趣,那么“出口模块”的目的是什么?我应该什么时候使用它? – Mikeb

+0

如果出于某种原因导出真正大量的类/接口的文件,您仍然可以使用'export module'或'export namespace' - 然后您可以通过在不同模块下进行拆分来在一个文件中构造它们。但在这种情况下,我个人建议改为创建两个文件。更详细的解释 - 这是一个很好的线索来阅读:http://stackoverflow.com/questions/30357634/how-do-i-use-namespaces-with-typescript-external-modules – Amid

0

我不知道如何摆脱“丑陋的”Controllers.MyApp。控制器,您必须指定完全限定名称空间+名称。

现在,恕我直言(在我的愚见),我认为这没有什么“丑陋的”。 如果您从其他名称空间引用该名称,则只需完全限定名称。但是如果你从相同的命名空间引用它,你不需要全名。说得通?

此外,我更愿意将所有的引用都添加到单个.TS文件(例如Reference.ts),并且只是将该引用添加到任何地方。该参考文件以排序的方式引用项目中的所有.TS文件(因此编译器可以从上到下正确编译)。