Búsqueda de sitios web

cómo inyectar correctamente el tipo de un método o propiedad antes de aplicar un mixin a una SuperClase dada en TypeScript


En el ejemplo a continuación, el tipo de método no se encuentra correctamente en la clase pasada como parámetro como superclase a la función mixin:

type Constructor = new (...args: any[]) => {};

function ClassMixin<TBase extends Constructor>(Base: TBase) {
    return class extends Base {
        method() {
            console.log("method method method method");
        }
    }
}

const MyClass = ClassMixin(class Z {
    constructor() {
        this.method(); // NOT OK: Property 'method' does not exist on type 'Z'
    }
});

const z = new MyClass();

z.method(); // <---- ok

ejemplo de patio de juegos


Encontré una solución alternativa para que funcione, pero estoy buscando una solución más 'automática', revisa la solución alternativa a continuación:

type Constructor = new (...args: any[]) => {};

function ClassMixin<TBase extends Constructor>(Base: TBase) {
    return class extends Base {
        method() {
            console.log("method method method method");
        }
    }
}

interface ClassMixinInterface {
    method(): void
}

interface Z extends ClassMixinInterface { }

class Z {
    constructor() {
        this.method(); // <---- ok
    }
}

const MyClass = ClassMixin(Z);

const z = new MyClass();

z.method(); // <---- ok

ejemplo de solución alternativa para el patio de juegos