angular - Typescript - serializar clase sin propiedades añadidas dinámicamente
Tengo un conjunto de objetos de TypeScript que han sido iniciados, pero en el código necesito agregar algunas propiedades dinámicamente a esos objetos. Si necesito serializar el objeto convirtiéndolo en cadena, ¿cómo puedo hacerlo para que no incluya las propiedades agregadas dinámicamente? Como tengo muchas clases y clases internas, estoy buscando un enfoque genérico en lugar de hacerlo caso por caso.
Entonces, como ejemplo, tengo una clase definida de la siguiente manera:
export class Car {
public colour: string = '';
public model: string = '';
public diesel?: boolean = false;
constructor () {}
}
Ahora en el código estoy configurando el coche anterior como uno que manejo en este momento:
let car: Car = new Car();
car.model = 'modelA';
car.colour = 'black';
car['active'] = true;
Y luego, en algún lugar del código, tengo que tomar el coche activo y serializar el objeto para que pueda, es decir, enviar los datos al servidor:
JSON.stringify({'data': car});
Lo que estoy buscando ahora es la representación en cadena del objeto sin las propiedades añadidas dinámicamente, pero un enfoque que sea genérico para que no tenga que describir lo que quiero eliminar.
Se busca ayuda ;-)
Respuesta #1
Puedes mantener una lista de las "claves conocidas" y usarlas al serializar:
class Car {
private static keys = ["colour", "model", "diesel"];
public colour: string = '';
public model: string = '';
public diesel?: boolean = false;
constructor() { }
toJsonString(): string {
const data = {};
Car.keys.forEach(key => data[key] = this[key]);
return JSON.stringify(data);
}
}
Puedes usar decoradores para crear esta lista estática.
O :
class Car {
public colour: string = '';
public model: string = '';
public diesel?: boolean = false;
constructor() {
this.toJsonString = function (keys) {
const data = {};
keys.forEach(key => data[key] = this[key]);
return JSON.stringify(data);
}.bind(this, Object.keys(this));
}
toJsonString: () => string;
}
Respuesta #2
Puedes mantener un arreglo de las claves originales en una propiedad y usar una implementación personalizada de toJSON en tu clase para controlar que solo se serialicen las claves originales:
export class Car {
public colour: string = '';
public model: string = '';
public diesel?: boolean = false;
private _keys: string[] // Note that this is not initialized
constructor() {
this._keys = Object.keys(this);
}
toJSON() {
var obj: any = {};
this._keys.forEach(key => {
obj[key] = this[key]
});
return obj
}
}
let car: Car = new Car();
car.model = 'modelA';
car.colour = 'black';
car['active'] = true;
console.log(JSON.stringify({ 'data': car }));
