2016-11-24 53 views
5

我是新来的TypeScript,我对模块和命名空间的了解越多,它就越困惑。我应该使用模块吗?我应该去命名空间吗?我应该同时使用吗?帮帮我!TypeScript组织:名称空间?模块?混淆

我已经现有的JavaScript(.js文件),我试图将转换为打字稿文件。 有一个.js文件包含一些通用函数和一个.js文件,其中包含一些特定于过滤器的函数。现在

我想用打字稿更多的组织这一点,因为我通常会用C#做的。

这是正确的用法还是应该如何组织?

我没有使用模块,应该吗? (如何?)

Company.ts

namespace Company { 

    // nothing yet, but in future it might. 

} 

Company.Project.ts

namespace Company.Project { 

    import Company; // like this? 

    let myVar : string = "something"; 

    export function handyGeneralFunction1(foo, bar) { 
    // ... 
    } 

    export function handyGeneralFunction2(foo, bar, foo, bar) { 
    // ... 
    doInternalCalc(); 
    // ... 
    } 

    export function handyGeneralFunction3() { 
    // ... 
    } 

    function doInternalCalc() { 
    // ... 
    } 
} 

Company.Project.Filter.ts

namespace Company.Project.Filter { 

    import Project = Company.Project; // like this? 

    export function initializeFilter() { 
     // ... 
     initMetadata(); 
     // ... 
    } 

    function initMetadata() { 
     // ... 
     Project.handyGeneralFunction3(); 

     let helper : FilterHelper = new FilterHelper("aaaa,bbbb"); 
     let res:string[] = helper.parseData(); 
    } 

    function foo() { 
     // ... 
     let x :string = Project.myVar + " else"; // can I use myVar here? 
    } 

    // a class in the namespace 
    export class FilterHelper { 

     data: string; 

     constructor(theData: string) { 
      this.data = theData; 
     } 

     parseData() : string[] { 
      // ... 
      return new Array<string>(); 
     } 
    } 

} 

回答

1

如果您有可能真正改善项目结构,那么您应该使用模块而不是名称空间。根据项目的规模,这可能需要一些努力。如果您的应用程序是没有那么大,你不希望投资于切换到不同的编译系统,可以处理实时模块

介绍命名空间可能是有用的。使用名称空间并不比包含函数和变量的一些命名全局变量多得多。这很容易让你感到困惑,因为你没有任何适当的依赖结构。您需要注意以正确的顺序导入所有文件,以使命名空间正常工作。您使用的导入语法甚至可以省略,因为您无论如何都只引用另一个全局对象,该对象需要在该时间点初始化。

所以命名空间可能是你的第一步,如果你没有做你的代码的任何变化较大的可能性。对于面向未来的设置,我肯定会建议使用真实模块。但请注意,这不是免费的。

如需进一步信息,我建议看看这个官方的评论在https://www.typescriptlang.org/docs/handbook/namespaces-and-modules.htmlhttps://basarat.gitbooks.io/typescript/content/docs/project/namespaces.html

+0

在打字稿深潜的部分,你可以给这个代码将如何看起来像模块的例子吗?因为我从来没有在JavaScript或打字稿中使用过模块。 (实际上我第一次使用JavaScript中的命名空间)。 – juFo