es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo crear una clase abstracta en línea en TypeScript?

Este es el error que estoy enfrentando:

src/Model.ts:11:16 - error TS2797: Una clase de mixin que se extiende de una variable de tipo que contiene una firma de construcción abstracta también debe declararse como 'abstracta'.

11   return class Foo2 extends Base {
                  ~~~~

y este es el código:

abstract class ModelBase {
  bar() {
    console.log("bar")
  }
}

type GConstructor<t =="" {}=""> = abstract new (...args: any[]) => T;
type Foo = GConstructor<modelbase>;

function Foo2<tbase extends="" foo="">(Base: TBase) {
  return class Foo2 extends Base {
    foo() {
      console.log(this.bar())
    }
  }
}

export const Model = Foo2(ModelBase);

Si agrego la palabra clave abstracta a la sentencia de retorno, como esta:

  return abstract class Foo2 extends Base {

Obtengo el error:

src/Model.ts:11:19 - error TS1005: Se esperaba ';'.

11   return abstract class Foo2 extends Base {
                     ~~~~~

Entonces, ¿cómo puedo hacer que funcione? Esencialmente, agregando un mixin a una clase abstracta para obtener otra clase abstracta.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para que esto funcione, es necesario convertir la declaración de retorno en una expresión eliminando la palabra clave “abstract” y en su lugar agregando la palabra clave “abstract” al parámetro de tipo de la función.

    Aquí está el código actualizado:

    clase abstracta ModelBase {
      bar() {
        console.log("bar")
      }
    }
    
    tipo GConstructor<t =="" {}=""> = new (...args: any[]) => T;
    tipo Foo = GConstructor<modelbase>;
    
    función Foo2<tbase extiende="" foo="">(Base: TBase) {
      clase abstracta Foo2Abstract extiende Base {
        foo() {
          console.log(this.bar())
        }
      }
      return Foo2Abstract;
    }
    
    exportar const Modelo = Foo2(ModelBase);
    

    En este código actualizado, creamos una nueva clase abstracta llamada “Foo2Abstract” dentro de la función “Foo2” y la extendimos en lugar de “Base”. También hicimos que la función “Foo2” fuera abstracta agregando la palabra clave “abstract” a su parámetro de tipo.

    Esto debería resolver el error y permitirle agregar un mixin a una clase abstracta que resulte en otra clase abstracta.

Comments are closed.