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.

Pase un parámetro de objeto estilo diccionario que implemente propiedades T a la clase .

Estoy utilizando la herencia para inicializar las propiedades de la clase class<T> con un objeto Object que implementa todas las propiedades de T dentro de {...} pasado al constructor

export default abstract class DatabaseObjectModel<T> extends JSONModel<T> {
  constructor(json: T) {
    super();
    this.fromJSON(json);
  }
}

export default abstract class JSONModel<T> extends ModelValidation {
  // abstract toJSON(): Object;
  // abstract fromJSON(json: Object): T;

  toJSON() {
    // toJSON predeterminado
    return JSON.parse(JSON.stringify(this));
  }

  fromJSON(json: Object) {
    // Para cada clave de json, asignar el valor a this.key
    for (let key in json) {
      this[key] = json[key];
    }
  }
}

El problema es que, cuando inicializo las clases heredadas de DatabaseObjectModel de esta manera:

new ImplementingDatabaseObjectModel({
    id: randomUUID(),
    name: "MASTER",
    permissions: [],
    assignedRoles: undefined,
})

Obtengo el siguiente error:

Argument of type '{...}' is not assignable to parameter of type 'ImplementingDatabaseObjectModel

¿Cómo puedo modificar el constructor de DatabaseObjectModel<T> para que acepte un objeto que implementa todas las propiedades de T, pero no su instancia?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para modificar el constructor de DatabaseObjectModel<t> para que acepte un Object que implemente todas las propiedades de type T pero no su instancia, puede agregar una restricción de tipo al parámetro del constructor.

    export default abstract class DatabaseObjectModel<t extends="" object=""> extends JSONModel<t> {
      constructor(json: T) {
        super();
        this.fromJSON(json);
      }
    }
    

    Al agregar T extends object como una restricción de tipo, se garantiza que el parámetro json que se pasa al constructor sea un objeto. Esto permite pasar un objeto como argumento que implemente todas las propiedades de type T sin instanciarlo.

    Con esta modificación, debería poder inicializar clases heredadas de DatabaseObjectModel de la siguiente manera:

    new ImplementingDatabaseObjectModel({
    id: randomUUID(),
    name: "MASTER",
    permissions: [],
    assignedRoles: undefined,
    })

Comments are closed.