2016-01-24 63 views
1

我正在尝试使用打字稿和角度来构造一个应用程序。我已经遵循了各种示例,其中指出使用模块将某些方面组合在一起,但是不知道我正在得到什么工作...我怎样才能在整个打字稿文件中编写模块和类

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

module test 
{ 
    class Blah 
    { 

    } 

} 

第二个文件test2.ts如下

module test 
{ 
    class Blah2 
    { 

    } 

} 

当我离开与“VAR测试”,这似乎不正确的重复的变量定义很TS产生在Javascript这段代码...

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

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

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

回答

0

每个文件已经是打字稿中的一个模块。你应该远离C#的'命名空间',就像思考打字稿中的模块一样。我有类似的问题,你现在用C#中的背景。 看看这个问题在这里: using external modules in typescript

我认为这会帮助你理解。

+1

嗨 - 如果我删除的模块定义我得到全局命名空间污染,因为每类成为一个全局变量.... –

+0

没有这样的东西“全局命名空间”。主要的是你的程序的模块化结构基本上是由它的文件/文件夹结构来定义的。你将你的'类似'类放在同一个文件夹中。并且要使用模块,只需通过“导入”语句导入需要的类(或全部使用*)。请记住,每个文件只有一个类别并不是什么坏主意。 – Amid

+1

我不敢相信这是一个很好的习惯去除模块定义,并且只是有很多全局变量,比如var Blah,var Blah2 ....每一个类都变成了一个看起来不错的变量。这可能适用于小应用程序,但不适用于较大的应用程序... –

0

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

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

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

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

// or similarly 

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

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

打字稿正在产生基本上等同的代码,只是没有明确提到窗口对象:

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 = {})));