javascript - JSON Dizisi/JS Nesnesini Özel Özelliklere Sahip TypeScript Sınıfına Eşleme
Bu, açık fakat düzenlenemeyen bir özniteliğe sahip bir TypeScript sınıfıdır:
export class Category {
private _id: number;
constructor(id: number){
this._id = id;
}
public get id(){
return this._id;
}
}
Bunu şöyle bir JSON'dan eşlemek istiyorum:
{ id: 1 }
Burada bazı bariz sorunlar var:
- “_id”nin sihirli bir şekilde “id”ye eşlenemeyeceğini biliyorum, bu yüzden belki tüm adı _ ile başlayan niteliklerin adını değiştiren özel bir mantık uygulayabilirim
- id parametresi ile yapıcıyı tutmak istiyorum ama belki de örnekleme öncesi argüman gerektiren bir nesneyi eşleyemem
- Boş bir yapıcı ile
Object.assign(new Category(), jsonObject)denedim, ancak bu işe yaramıyor çünküYalnızca getter'a sahip #<Category> nesnesinin id özelliği ayarlanamaz
Kaçınmak istediğim şey, özel niteliklere sahip her sınıf için bu şekilde özel eşleme mantığı yazmak; bazı diğer çözümleri ve kütüphaneleri denedim ama benim durumum için işe yaramadı, hepsi sadece genel niteliklere sahip sınıflara referans veriyor
Ne istediğimin başarılabilir olup olmadığını bile bilmiyorum, eğer durum öyle değilse, o zaman sadece public özniteliklere sahip sınıfı kullanmaya 'teslim olacağım'
Cevap #1
Buradaki yanlış anlama, sadece görünürlüğü yönetmek için bir getter/setter'a ihtiyacınız olduğudur. Ne yaparsanız yapın, kodun id değerine erişmesini ve değiştirmesini engelleyemezsiniz. Ancak, readonly değiştiricisinden yararlanarak IDE'ye (ve onu kullanan geliştiriciye) yalnızca özelliği okuyabileceğini/sadece get yapabileceğini söyleyebilirsiniz, bu da kodunuzu şu şekilde basitleştirir:
export class Category {
readonly id: number;
}
Şunu unutmayın ki readonly özelliği sadece derleme zamanında vardır ve çalışma zamanında herhangi bir etkisi yoktur. IDE'niz şunu yapmanızı engelleyecektir:
(new Category).id = 5;
Ama size kolayca şunları yapma imkânı sağlar:
const category = Object.assign(new Category, { id: 5 });
Cevap #2
Nesneyi kurucu üzerinden geçirin:
export class Category {
private _a: number;
private _b: string;
constructor(values: { a: number; b: string }){
this._a = values.a;
this._b = values.b;
}
public getA() { return this._a; }
public getB() { return this._b; }
}
Hâlâ JSON ile veya JSON olmadan çağırabilirsiniz:
let cat1 = Category (values: { a: 42, b: 'hello' });
let json = '{"a":42,"b":"hello"}'
let cat2 = Category (values: JSON.parse (json));
Alternatif olarak, değerleri doğrudan bir üye yerine bir nesnede tutun. Bu, nesneyi üye değişkenlere eşleştirmeyi gereksiz kılar:
export class Category {
private _values: {
a: number;
b: string;
}
constructor(values: { a: number; b: string }){
this._values = values;
}
public getA() { return this._values.a; }
public getB() { return this._values.b; }
}
Eski yapıcıyı korumak istiyorsanız, bunu şu şekilde yapabilirsiniz:
export class Category {
private _values: {
a: number;
b: string;
}
constructor(a: number, b: string) {
this._values = { a: a, b: b };
}
public static make (values: { a: number; b: string }) {
this._values = values;
}
public getA() { return this._values.a; }
public getB() { return this._values.b; }
}
