重写typescript类中包含闭包的javascript

重写typescript类中包含闭包的javascript,typescript,Typescript,如何在typescript类中重写下面的javascript。 原型中的greet2函数是一个立即调用函数 function Greeter(greeting) { this.greeting = greeting; } Greeter.prototype.greet = function() { return "Hello, " + this.greeting; } //an immediately invoke function Greeter.prototype.gre

如何在typescript类中重写下面的javascript。 原型中的greet2函数是一个立即调用函数

function Greeter(greeting) {
    this.greeting = greeting;
}

Greeter.prototype.greet = function() {
    return "Hello, " + this.greeting;
}

//an immediately invoke function
Greeter.prototype.greet2 = function{
    let blabla = 'hello, ';
    return function greet2(foo) {
        return blabla + foo;
    }
}();

let greeter = new Greeter({message: "world"});  

let button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function() {
    alert(greeter.greet2('tom'));
};

document.body.appendChild(button);
如何在typescript类中重写下面的javascript

使用属性初始值设定项:

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
    greet2 = (() => {                      // HERE 
        let blabla = 'hello, ';
        return function greet2(foo) {
            return blabla + foo;
        }
    })()
}

let greeter = new Greeter("world");

let button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function () {
    alert(greeter.greet());
}

document.body.appendChild(button);

您可以声明属性,然后在原型上初始化它:

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
    greet2!: (foo) => string;  // in case of strictPropertyInitialization
    static staticInitializer() {
        // Here we have access to non-public members of `Greeter`.
        Greeter.prototype.greet2 = function(){
            let blabla = 'hello, ';
            return function greet2(this: Greeter, foo) {
                return blabla + foo;
            }
        }();
    }
}
Greeter.staticInitializer();

实现时,您将能够使用真正的静态初始值设定项。

这比原始的效率低:它对实例化的每个对象计算一次,而不是在定义类时计算一次。