Búsqueda de sitios web

typescript extender propiedad de objeto de clase base


Antes que nada, pido disculpas, soy completamente nuevo en la programación orientada a objetos y estoy seguro de que hay una mejor manera de formular esta pregunta (una que probablemente arrojaría uno o diez resultados en una búsqueda).

Así que para facilitar mi vida y para explicar lo que quiero hacer, aquí está el código

class A {
  propertyA = {
    itemA: "a",
    itemB: "b".
    itemC: "c"
  }
  propertyB = {
    itemA: "A"
  }
}
class B extends A {
  propertyA.itemD = "d";
  propertyB.itemB = "B";
}

Recibo un error cuando intento hacer esto. Básicamente necesito que la clase base sea una plantilla y extender algunas cosas aquí y allá con la clase que la extiende. Por lo demás, solo necesita todas las otras propiedades (solo que no quiero volver a escribirlas para cada clase)

Respuesta #1

Así es como se hace en TypeScript

class A {
  propertyA = {
    itemA: "a",
    itemB: "b".
    itemC: "c"
  }
  propertyB = {
    itemA: "A"
  }
}
class B extends A {
  constructor(){
     super();
     this.propertyA.itemD = "d";
     this.propertyB.itemB = "B";
  }
}


var x = new B();
console.log(x.propertyA.itemD);

Respuesta #2

La respuesta aceptada aún me daba advertencias de TypeScript al escribir las propiedades de mi objeto. Puedes suprimir las advertencias la propiedad no existe en el tipo si tienes la opción de volver a declarar completamente la propiedad del objeto principal, de la siguiente manera:

class A {

  propertyA: {
    itemA: string
  } = {
    itemA: '123'
  };

}

class B extends A {

  propertyA: {
    itemA?: string, // Need to re-declare this
    itemB?: string
  } = {
    itemA: '123', // Need to re-initialise this
    itemB: '456'
  };

}

Esto funciona mejor si no inicializas las propiedades cuando se declaran, sino en el constructor u otros métodos si es posible. Esto significa entonces que no necesitas saber a qué inicializa la propiedad la clase A a menos que la sobrescribas específicamente:

class A {

  propertyA: {
    itemA?: string
  } = {};

  constructor() {
    this.propertyA.itemA = '123'; // Now we don't need to do this in derived classes
  }

}

class B extends A {

  propertyA: {
    itemA?: string, // Need to re-declare this
    itemB?: string
  } = {};

  constructor() {
    super();
    this.propertyA.itemB = '456';
  }

}

Artículos relacionados