TypeScript组织:命名空间?模块?混淆

5

我对TypeScript比较陌生,越是读有关模块和命名空间的内容,就越感到困惑。我应该选择模块还是命名空间?两者都用吗?求助!

我有一些已有的JavaScript(.js)文件,现在要转换成TypeScript。其中一个.js文件包含一些通用函数,另一个.js文件包含一些特定于过滤器的函数。

我现在希望用TypeScript更好地组织这些函数,就像我通常在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个回答

3
如果您有可能真正改进项目结构,那么一定要使用模块(modules)而不是命名空间(namespaces)。根据项目的规模,这可能需要一些努力。
引入命名空间可能很有用,如果您的应用程序不是很大,而且您不想投资于切换到可以处理真正模块的不同构建系统。使用命名空间不过是一些包含函数和变量的命名全局变量。这很快就会变得混乱,因为您没有任何适当的依赖关系结构。您需要注意以正确的顺序导入所有文件,以使命名空间正常工作。您使用的导入语法甚至可以省略,因为您只引用另一个全局对象,该对象需要在那个时候初始化。
因此,如果您没有可能对代码库进行任何较大的更改,那么命名空间可能是您的第一步。对于具有未来性的设置,我肯定建议使用真正的模块。但请注意,这并非免费。
如需更多信息,请查看官方评论:https://www.typescriptlang.org/docs/handbook/namespaces-and-modules.html或TypeScript Deep Dive中的部分内容:https://basarat.gitbooks.io/typescript/content/docs/project/namespaces.html

你能否举个例子,展示一下使用模块后代码会是什么样子的呢?因为我之前从未在 JavaScript 或 TypeScript 中使用过模块。(事实上这也是我第一次在 JavaScript 中使用命名空间。) - juFo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接