我怎么写模块和&打字稿文件的类

时间:2016-01-24 07:53:53

标签: typescript

我正在尝试使用typescript和angular来构建应用程序。我已经按照各种例子说明了使用模块将某些方面组合在一起,但是不确定我得到的是否会起作用......

我有一个名为test.ts的文件,其结构如下

module test
{
  class Blah
  {

  }

}

第二个文件test2.ts如下

module test
{
   class Blah2
   {

   }

}

当TS在Javascript中生成此代码时,我留下了“var test”的重复变量定义,这看似不对......

var test;
(function (test) {
       var Blah = ......
})(test || (test = {}));

var test;
(function (test) {
       var Blah2 = ......
})(test || (test = {}));

如何绕过'test'的重复变量定义或者这不是问题?

2 个答案:

答案 0 :(得分:0)

每个文件都是打字稿中的模块。你应该远离C#'命名空间',就像想到typescript中的模块一样。我在C#中的背景问题上遇到了类似的问题。 在这里看看这个问题: zoc picture

我认为这有助于你理解。

答案 1 :(得分:0)

  

如何解决'test'的重复变量定义或者这不是问题?

由于JavaScript提升,这不是问题。变量“悬挂”到第一次使用的位置。除非您为其设置新值,否则不会重新定义。

命名空间模式可以这样写:

(function (namespace) {
   ...
}(window.namespace = window.namespace || {}));

// or similarly

(function (namespace) {
   ...
}(window.namespace || (window.namespace = {})));

换句话说:“声明一个函数并立即调用它,传递一个对象;如果该对象尚未初始化,则从头开始创建一个新对象并使用它,否则继续构建相同的对象。” / p>

TypeScript生成基本等效的代码,只是没有明确引用窗口对象:

var namespace; // same as window.namespace but does not assume window exists or what it is
(function (namespace) {
   ...
}(namespace || (namespace = {})));

实际上,它还允许生成的代码不一定存在于全局命名空间中。 var namespace;与全局命名空间中的window.namespace相同,但在其他范围内则不同。例如,如果您的命名空间嵌套在另一个命名空间中,则第二个命名空间使用相同的模式,然后该变量不会隐式附加到window,而是存在于外部命名空间对象的范围内。例如:

var outerNamespace; // same as window.outerNamespace
(function (outerNamespace) {
   var innerNamespace; // not the same as window.innerNamespace
   (function (innerNamespace) {
      ...
   }(outerNamespace.innerNamespace || (outerNamespace.innerNamespace = {})));
}(outerNamespace || (outerNamespace = {})));

...

var outerNamespace; // doesn't matter because of JS variable hoisting
(function (outerNamespace) {
   ...
}(outerNamespace || (outerNamespace = {})));