javascript - TypeScript - cómo heredar una clase y sobrescribir un método lambda
Tengo una clase heredada, y necesito que la clase padre tenga un método virtual, que sea sobrescrito en la clase hija. Este método se llama desde el constructor base y necesita acceder a las propiedades de la instancia, por lo que necesita ser una función lambda, de modo que "this" sea "_this". El problema es que sobrescribir un método lambda no funciona para mí como sobrescribir uno que no es lambda. ¿Es esto posible? Si no, me gustaría entender por qué.
Además, ¿será "esto" siempre igual a "_esto" cuando el método solo se llama desde el constructor?
class Base {
protected prop = null;
constructor() {
this.init();
this.initLambda();
}
init() {
console.log("Base init");
}
initLambda = () => {
console.log("Base initLambda");
}
}
class Derived extends Base {
constructor() {
super();
}
init() {
console.log("Derived init");
}
initLambda = () => {
//let x = this.prop;
console.log("Derived initLambda");
}
}
Salida:
Inicialización derivada
Inicialización baseLambda
Respuesta #1
Bueno, no puedes tener eso.
Se abrió un problema, pero se cerró como "por diseño".
Deberías usar métodos regulares:
class Base {
protected prop = null;
constructor() {
this.init();
this.initLambda();
}
init() {
console.log("Base init");
}
initLambda() {
console.log("Base initLambda");
}
}
class Derived extends Base {
constructor() {
super();
}
init() {
console.log("Derived init");
}
initLambda() {
console.log("Derived initLambda");
}
}
Y entonces funcionará.
En cuanto a mantener el this correcto, siempre puedes pasar una llamada al método como una función flecha:
doit() {
setTimeout(() => this.init(), 1);
}
O utiliza la función Function.prototype.bind:
setTimeout(this.init.bind(this));
Además, la cosa _this que produce el compilador de TypeScript es solo un truco para rellenar las funciones flecha para ES5, pero si cambias el objetivo a ES6 entonces no la usará.
Editar :
Puedes guardar los métodos vinculados como miembros:
class Base {
...
public boundInit: () => void;
constructor() {
...
this.boundInit = this.initLambda.bind(this);
setTimeout(this.boundInit, 500);
}
...
Con eso, cuando hago new Derived() esto es lo que obtengo:
Inicialización derivada
Inicialización derivadaLambda/después de 200 milisegundos
