为什么TypeScript在匿名函数中包装类?

Mig*_*ork 10 javascript typescript

比方说,我们有一个Dog类:

class Dog {
    static food;
    private static static_var = 123;

    constructor(private name) {}

    speak() {
        console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var);
    }
}
Run Code Online (Sandbox Code Playgroud)

编译成JS:

var Dog = (function () {
    function Dog(name) {
        this.name = name;
    }

    Dog.prototype.speak = function () {
        console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var);
    };

    Dog.static_var = 123;
    return Dog;
})();
Run Code Online (Sandbox Code Playgroud)

这同样有效并且不那么复杂:

function Dog(name) {
    this.name = name;
}

Dog.prototype.speak = function () {
    console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var);
};

Dog.static_var = 123;
Run Code Online (Sandbox Code Playgroud)

使用匿名函数包装器有什么(除"美学"之外)的原因吗?

Fré*_*idi 6

两者之间的主要区别与吊装有关.

TypeScript将类编译为函数表达式到变量的赋值.这意味着生成的构造函数仅在赋值时开始存在.在之前发生的代码中,Dog将被绑定undefined.

另一方面,您的实现使用一个需要提升的普通函数 - 该范围内的任何代码,包括在函数之前发生的代码,都可以调用Dog构造函数.

我想TypeScript更喜欢确保在实际定义类之前不存在类,可能允许在同一范围内的多个点重新定义类.