angular - Typescript - dinamik olarak eklenen özellikler olmadan sınıfı stringle
Başlatılmış bir TypeScript nesneleri setim var, ancak kodda bu nesnelere bazı özellikleri dinamik olarak eklemem gerekiyor. Eğer nesneyi string hâline getirerek serileştirmem gerekirse - bunu, dinamik olarak eklenen özellikleri dahil etmeyecek şekilde nasıl yapabilirim? Birçok sınıfım ve iç sınıflarım olduğu için tek tek çözümden ziyade genel bir yaklaşım arıyorum.
Örnek olarak, aşağıdaki şekilde tanımlanmış bir sınıfım var:
export class Car {
public colour: string = '';
public model: string = '';
public diesel?: boolean = false;
constructor () {}
}
Şimdi kodda yukarıdaki arabayı şu anda sürdüğüm araba olarak ayarlıyorum:
let car: Car = new Car();
car.model = 'modelA';
car.colour = 'black';
car['active'] = true;
Ve sonra kodun bir yerinde aktif arabayı alıp nesneyi serileştirmem gerekiyor, böylece verileri sunucuya gönderebilirim:
JSON.stringify({'data': car});
Şu anda aradığım şey, dinamik olarak eklenen özellikler olmadan nesnenin string temsili, ancak yaklaşım genel olmalı, böylece neyi kaldırmak istediğimi açıklamam gerekmiyor.
Tüm yardımlar bekleniyor ;-)
Cevap #1
Serileştirirken kullanmak üzere "bilinen anahtarlar" listesini tutabilirsiniz:
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);
}
}
Bu sabit listeyi oluşturmak için dekoratörleri kullanabilirsiniz.
Veya :
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;
}
Cevap #2
Orijinal anahtarların bir dizisini bir özellikte saklayabilir ve sınıfınızda sadece orijinal anahtarların serileştirilmesini kontrol etmek için özel bir toJSON uygulaması kullanabilirsiniz:
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 }));
