¿Cómo puedo usar un método del padre en un método hijo que se usa como función de devolución de llamada?
class Parent { numbers: number[]; constructor(numbers: number[]) { this.numbers = numbers; } protected iterateNumbers(iterCallback: (nb: number) => void): void { for (const nb of this.numbers) { iterCallback(nb); } } protected inc(nb: number): number { return nb++; } } class Child extends Parent { constructor(numbers: number[]) { super(numbers) } getNumbers(): void { this.iterateNumbers(this.displayNumber); } private displayNumber(nb: number): void { console.log(this.inc(nb)); } } const c = new Child([1, 2, 3, 4, 5]); c.getNumbers(); Este código da como resultado este error: TypeError: Cannot read property 'inc' of undefined
modificado con super()
Encontré una manera de hacer lo mismo pero con un método no estático
El estilo ES6 le permite usar nuevas funciones, como la súper palabra clave. super palabra clave todo se trata del contexto de la clase principal, cuando está utilizando la sintaxis de clases ES6.
class Parent { numbers: number[]; constructor(numbers: number[]) { this.numbers = numbers; } protected iterateNumbers(predictionCallback: (nb: number) => void): void { for (const nb of this.numbers) { predictionCallback(nb); } } protected inc(nb: number): number { return nb++; } } class Child extends Parent { constructor(numbers: number[]) { super(numbers) } getNumbers() { this.iterateNumbers(this.displayNumber); } private displayNumber(nb: number): void { console.log(super.inc(nb)); } } const c = new Child([1, 2, 3, 4, 5]); c.getNumbers();Debe llamar al supermétodo en el constructor de la clase secundaria para acceder a las propiedades y métodos de la superclase.
Además, como tiene el método displayNumber privado, no podrá acceder a él desde un objeto creado a partir de la clase child . Eliminar la palabra clave privada permitiría el acceso
Intente cambiar su hijo extendido para incluir el método constructor y la súper llamada:
class Child extends Parent { constructor() { super() } getNumbers(): void { this.iterateNumbers(this.displayNumber); } displayNumber(nb: number): void { console.log(this.inc(nb)); } }Puede leer más en los documentos de MDN sobre la palabra clave super
ACTUALIZAR:
Después de probar un poco, encontré una solución a por qué recibe ese error, por supuesto, se trata de contexto. Si hace que el método inc sea estático, podrá llamarlo mediante Parent.inc()
Al pasar el método displayNumber como una devolución de llamada, está perdiendo el contexto de la clase desde la que desea llamar. Es por eso que obtienes el error indefinido.
class Parent { numbers: number[]; constructor(numbers: number[]) { this.numbers = numbers; } protected iterateNumbers(iterCallback: (nb: number) => void): void { for (const nb of this.numbers) { iterCallback(nb); } } static inc(nb: number): number { return nb++; } } class Child extends Parent { constructor(numbers: number[]) { super(numbers) } getNumbers(): void { this.iterateNumbers(this.displayNumber); } private displayNumber(nb: number): void { console.log(Parent.inc(nb)); } } const c = new Child([1, 2, 3, 4, 5]); c.getNumbers(); // prints 1 2 3 4 5Si ejecuta este código, verá los números impresos.
Ahora, al llamar al método super en el constructor child y actualizar el método inc para que sea estático y llamarlo como tal, creo que obtendrá los resultados esperados.