La base abstracta tiene un método que toma una base/derivada y realiza algo sobre ella. Parece que me estoy perdiendo algo con la escritura, tratando de averiguar qué.
Intento 1:
abstract class Base { protected runFuncOnThis = (func: (baseOrDerived: Base) => void) => { func(this); }; } class Derived extends Base { public doIt = () => { this.runFuncOnThis((derived: Derived) => { // ERROR HERE console.log(derived); }); }; }Error: el argumento de tipo '(derivado: Derivado) => vacío' no se puede asignar al parámetro de tipo '(baseOrDerived: Base) => vacío'. Los tipos de parámetros 'derivados' y 'baseOrDerived' son incompatibles. Falta la propiedad 'doIt' en el tipo 'Base' pero se requiere en el tipo 'Derivado'.ts(2345)
Intento 2:
abstract class Base2 { protected runFuncOnThis = <T extends Base2>(func: (baseOrDerived: T) => void) => { func(this); // ERROR HERE }; } class Derived2 extends Base2 { public doIt = () => { this.runFuncOnThis((derived: Derived2) => { console.log(derived); }); }; }Error: el argumento de tipo 'esto' no se puede asignar al parámetro de tipo 'T'. 'esto' es asignable a la restricción de tipo 'T', pero 'T' podría instanciarse con un subtipo diferente de restricción 'Base2'.ts(2345)
Dado que está usando this en una función de flecha, significa que this es el contexto actual ( Base ) mientras que func quiere Derived como su argumento. Cambie el tipo de método a una función normal (que tiene su propio contexto) y this como T extends Base para satisfacer el argumento de func.
abstract class Base { protected runFuncOnThis<T extends Base>(this: T, func: (baseOrDerived: T) => void) { func(this); }; } class Derived extends Base { public doIt = () => { this.runFuncOnThis((derived) => { console.log(derived); }); }; } class Derived2 extends Base { public doIt = () => { this.runFuncOnThis((derived) => { console.log(derived); }); }; public someProperty = 123; }