Javascript 生成冗余变量的类型脚本

Javascript 生成冗余变量的类型脚本,javascript,compilation,typescript,Javascript,Compilation,Typescript,考虑以下类型脚本代码: module demoAppModule{ 'use strict'; export module nest{ export var hello = function () { alert('Hello!'); }; } } demoAppModule.nest.hello(); var demoAppModule; (function (demoAppModule) { 'us

考虑以下类型脚本代码:

module demoAppModule{
    'use strict';

    export module nest{
        export var hello = function () {
            alert('Hello!');
        };
    }
}

demoAppModule.nest.hello();
var demoAppModule;
(function (demoAppModule) {
    'use strict';

    (function (nest) {
        nest.hello = function () {
            alert('Hello!');
        };
    })(demoAppModule.nest || (demoAppModule.nest = {}));
    var nest = demoAppModule.nest;
})(demoAppModule || (demoAppModule = {}));

demoAppModule.nest.hello();
传输后,我们有以下javascript代码:

module demoAppModule{
    'use strict';

    export module nest{
        export var hello = function () {
            alert('Hello!');
        };
    }
}

demoAppModule.nest.hello();
var demoAppModule;
(function (demoAppModule) {
    'use strict';

    (function (nest) {
        nest.hello = function () {
            alert('Hello!');
        };
    })(demoAppModule.nest || (demoAppModule.nest = {}));
    var nest = demoAppModule.nest;
})(demoAppModule || (demoAppModule = {}));

demoAppModule.nest.hello();
为什么会生成此行?我的眼睛疼

var nest = demoAppModule.nest;

简短回答:需要在本地访问模块变量。例如

module demoAppModule{
    'use strict';

    export module nest{
        export var hello = function () {
            alert('Hello!');
        };
    }

    // The following would not be possible without that line 
    console.log(nest.hello);
}

demoAppModule.nest.hello();
更详细的回答:它类似于模块前添加的var,例如注意
var x

// TypeScript 
module x{export var foo;}
// Generated JavaScript 
var x;
(function (x) {
    x.foo;
})(x || (x = {}));
但是,当您在模块内+导出模块时,
var
需要添加到
outermoule.innermodule
中,因此您不需要预先执行
var innermodule
。将其添加到
outermodule
,然后创建一个局部变量以指向
innermodule
,您可以在生成的javascript中看到该变量:

// Notice var here 
var demoAppModule;
(function (demoAppModule) {
    'use strict';

    // Notice no var here 
    (function (nest) {
        nest.hello = function () {
            alert('Hello!');
        };
    })(demoAppModule.nest || (demoAppModule.nest = {}));
    // Notice var assinged afterwards
    var nest = demoAppModule.nest;

    // The following would not be possible without that line
    console.log(nest.hello);
})(demoAppModule || (demoAppModule = {}));

demoAppModule.nest.hello();

那句话对我来说似乎毫无用处。我能想到的唯一原因是编译器认为必须在函数
hello
之前定义参数
nest
,但是赋值发生在最底层,然后对它不做任何处理。谢谢。读了这篇文章,我意识到如果我后来使用了nest,就像您的示例中的日志记录一样,它看起来就不会那么不必要了。