首页 > 解决方案 > 在打字稿类中重写包含闭包的javascript

问题描述

如何在打字稿类中重写以下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

解决方案


您可以声明该属性,然后在原型上对其进行初始化:

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();

实施此建议后,您将能够使用真正的静态初始化程序。


推荐阅读