Angularjs TypeScript:无法在IIFE中定义类

Angularjs TypeScript:无法在IIFE中定义类,angularjs,typescript,Angularjs,Typescript,我想用TypeScript在IIFE中定义一个类,但总是出错,这个类可以在模块或文件中定义。下面的代码不起作用 (function(){ // Error here class Person { } })() 我之所以需要这样做,是因为我不想公开任何全局变量,甚至不想公开模块。你们可能想知道为什么,因为我会以下面的方式将它们添加到角度模块中 (function(){ angular.module('app').controller('HomeControlle

我想用TypeScript在IIFE中定义一个类,但总是出错,这个类可以在模块或文件中定义。下面的代码不起作用

(function(){
    // Error here
    class Person {

    }
})()
我之所以需要这样做,是因为我不想公开任何全局变量,甚至不想公开模块。你们可能想知道为什么,因为我会以下面的方式将它们添加到角度模块中

(function(){
    angular.module('app').controller('HomeController', HomeController);
    // error here
    class HomeController {
    }
})();

创建类时,它会为您生成一个iLife:

班级:

class Example {

}
JavaScript中的结果:

var Example = (function () {
    function Example() {
    }
    return Example;
})();
如果要将类排除在全局范围之外,可以使用模块:

module Stack {
    export class Example {

    }

    export class Overflow {

    }
}
只有堆栈模块出现在全局范围中

var Stack;
(function (Stack) {
    var Example = (function () {
        function Example() {
        }
        return Example;
    })();
    Stack.Example = Example;
    var Overflow = (function () {
        function Overflow() {
        }
        return Overflow;
    })();
    Stack.Overflow = Overflow;
})(Stack || (Stack = {}));

如果您想更进一步,您可以使用外部模块-这样做时,您的任何类或模块都不会添加到全局范围。

创建类时,它会为您生成IIFE:

var Stack;
(function (Stack) {
    var Example = (function () {
        function Example() {
        }
        return Example;
    })();
    Stack.Example = Example;
    var Overflow = (function () {
        function Overflow() {
        }
        return Overflow;
    })();
    Stack.Overflow = Overflow;
})(Stack || (Stack = {}));
班级:

class Example {

}
JavaScript中的结果:

var Example = (function () {
    function Example() {
    }
    return Example;
})();
如果要将类排除在全局范围之外,可以使用模块:

module Stack {
    export class Example {

    }

    export class Overflow {

    }
}
只有堆栈模块出现在全局范围中

var Stack;
(function (Stack) {
    var Example = (function () {
        function Example() {
        }
        return Example;
    })();
    Stack.Example = Example;
    var Overflow = (function () {
        function Overflow() {
        }
        return Overflow;
    })();
    Stack.Overflow = Overflow;
})(Stack || (Stack = {}));

如果你想更进一步,你可以使用外部模块——当你这样做的时候,你的任何类或模块都不会被添加到全局作用域中。

Typescript已经将类的内容包装到函数中,所以我不确定你想要实现什么——只需在下面检查生成的代码。或者我误解了你的意思?我认为这是可能的:支持本地类型和类表达式。Typescript已经将类的内容包装到函数中,所以我不确定你想要实现什么-只需在下面检查生成的代码。或者我误解了你的意思?我认为这是可能的:支持本地类型和类表达式。但是Stack是公开的,khagesh不想公开任何全局变量。我已经展示了许多解决方案,最后一个是零全局范围外部模块。零全局范围的目标是令人钦佩的,但我喜欢提供答案,帮助其他人在全局范围内寻找更少的项以及零项。@SteveFenton,正如Tarh所说,它仍然将堆栈作为全局变量公开。使用外部模块,意味着您必须在客户端使用require.js。它仍然不能解决手头的问题。@khagesh-我只是介绍所有当前选项。使用哪一个完全由您决定:您可以使用外部模块,在全局范围内不保留任何内容,或者在全局范围内接受一个项目,或者您可以避免使用类。您是否知道,您可以在所有文件中为同一个模块做出贡献,即20个文件仍然只会添加到单个全局?但是堆栈是公开的,khagesh不想公开任何全局变量。我已经展示了许多解决方案,最后一个是零全局范围外部模块。零全局范围的目标是令人钦佩的,但我喜欢提供答案,帮助其他人在全局范围内寻找更少的项以及零项。@SteveFenton,正如Tarh所说,它仍然将堆栈作为全局变量公开。使用外部模块,意味着您必须在客户端使用require.js。它仍然不能解决手头的问题。@khagesh-我只是介绍所有当前选项。使用哪一个完全由您决定:您可以使用外部模块而不在全局范围内保留任何内容,或者您接受全局范围内的一个项目,或者您可以避免使用类。您是否知道您可以在所有文件中为同一个模块做出贡献,即20个文件仍然只会添加到单个全局范围内?
var Stack;
(function (Stack) {
    var Example = (function () {
        function Example() {
        }
        return Example;
    })();
    Stack.Example = Example;
    var Overflow = (function () {
        function Overflow() {
        }
        return Overflow;
    })();
    Stack.Overflow = Overflow;
})(Stack || (Stack = {}));