Tengo una clase moderadamente grande con muchos atributos diferentes. Dado que hay muchos de ellos, crear un constructor para la clase sería bastante torpe (imagina tener un nuevo CLassObj (par1, par2, par3, par4, par5, par6, par7, ... pares) en tu código. es imposible recordar el orden, por lo que generalmente lo inicializo así:

{
    movie: this.movie,
    row: 10,
    seat: 12,
    cashPrice: 170,
    discount: 0,
    bonusesPrice: 4200,
    is3D: false,
    isVR: false,
    includesGlasses: false,
    promocode: ''
  }

Y esta bien Pero si tengo un método dentro de la clase, ¡también necesitaría redefinirlo!

¿Hay alguna forma de hacer parámetros opcionales sin hacer un constructor? ¿O hay una forma sensata de hacer que el constructor tome el objeto?

0
Nausik 31 oct. 2017 a las 13:32

3 respuestas

La mejor respuesta

Puede usar un Partial<T> como parámetro para el constructor. Esto permite un objeto literal que opcionalmente especifica cualquier miembro de la clase:

class BigClass {
    movie: string;
    row: number;
    seat:number;
    cashPrice: number;
    discount: number;
    bonusesPrice: number;
    is3D: boolean;
    isVR: boolean;
    includesGlasses: boolean;
    promocode: string;
    public constructor (cfg: Partial<BigClass>){
        Object.assign(this, cfg);
    }
    method (){

    }
}

var d = new BigClass({
    is3D: true
});
1
Titian Cernicova-Dragomir 31 oct. 2017 a las 10:37

Aquí hay una muestra de cómo crear una clase con parámetros opcionales:

export class User {
  constructor(
    public id?: string,
    public fullName?: string,
  ) {}
}

Ahora puedes llamarlo con

let user = new User();
let user = new User('ID1');
let user = {};
let user = { id: 'ID1' }; // Your IDE will give you completion in that case
// And so on ...
1
user4676340user4676340 31 oct. 2017 a las 10:37

Hay bastantes soluciones a este problema.

Puede usar la deconstrucción: C:

Puede usar algunos patrones de diseño como el generador: C:

0
Kacper Wiszczuk 31 oct. 2017 a las 13:06