Derlenmiş Javascript'e bir göz atın ve siz sadece derleme için olduğu için türün kaybolduğunu göreceksiniz. Şu anda derleyiciye somejson
nesnesinin Person
türünde olduğunu söylüyorsunuz. Derleyici size inanıyor, ancak bu durumda bu doğru değil.
Bu sorun, bir çalışma zamanı JavaScript sorundur.
Bunu işe koymanın temel amacı, bir şekilde JavaScript'in sınıflar arasındaki ilişkinin ne olduğunu anlatmasıdır. Yani ...
- sınıflar arasındaki ilişkiyi açıklamak için bir yol bulun.
- Bu ilişki verilerine göre jsonları otomatik olarak sınıflara eşlemek için bir şeyler oluşturun.
bunu çözmek için birçok yolu vardır, ama başımın üstü kapalı bir örnek sunacağız. Bu, yapılması gerekenleri açıklamaya yardımcı olmalıdır. Biz benzer türdeki nasıl JavaScript söylememe gerek
{
name: 'John',
child: {
name: 'Sarah',
child: {
name: 'Jacob'
}
}
}
Person
örnekleri olmak otomatik olarak bu eşleştirmek için:
class Person {
name: string;
child: Person;
public giveName() {
return this.name;
}
}
Ve bu json verilerini:
bu sınıf var ki . TypeScript türü bilgilerini kullanamıyoruz çünkü bir kere derlendikten sonra kaybedeceğiz. Bunu yapmanın bir yolu, bunu açıklayan türde bir statik özelliğe sahip olmaktır.Örneğin: Aşağıdaki kod çalışacaktır Şimdi
function createInstanceFromJson<T>(objType: { new(): T; }, json: any) {
const newObj = new objType();
const relationships = objType["relationships"] || {};
for (const prop in json) {
if (json.hasOwnProperty(prop)) {
if (newObj[prop] == null) {
if (relationships[prop] == null) {
newObj[prop] = json[prop];
}
else {
newObj[prop] = createInstanceFromJson(relationships[prop], json[prop]);
}
}
else {
console.warn(`Property ${prop} not set because it already existed on the object.`);
}
}
}
return newObj;
}
:
const someJson = {
name: 'John',
child: {
name: 'Sarah',
child: {
name: 'Jacob'
}
}
};
const person = createInstanceFromJson(Person, someJson);
console.log(person.giveName()); // John
console.log(person.child.giveName()); // Sarah
console.log(person.child.child.giveName()); // Jacob
class Person {
static relationships = {
child: Person
};
name: string;
child: Person;
public giveName() {
return this.name;
}
}
Sonra burada bu ilişki verilerine dayanarak bizim için nesneleri oluştururken kolları yeniden kullanılabilir fonksiyonun bir örnek
Playground
İdeal, en iyi yol, aslında TypeScript kodunu okuyan ve sınıflar arasındaki ilişkiyi tutan bir nesne oluşturan bir şeyin kullanılması olacaktır. Bu şekilde, ilişkileri el ile sürdürmemize ve kod değişiklikleri konusunda endişelenmemize gerek yoktur. Örneğin, şu anda kodu yeniden düzenleme kodu bu kurulumla ilgili bir risktir. Şu an böyle bir şeyin var olduğundan emin değilim, ama kesinlikle mümkün.
Alternatif Çözüm Sadece ben zaten biraz farklı çözüm ile benzer bir soru cevap fark
(yani gerçi yuvalanmış verileri içermez). Biraz daha fazla fikir için buradan okuyabilirsiniz:
JSON to TypeScript class instance?
Tip döküm, derleyici/IDE için sadece bir ipucudur. Düz Javascript nesnesine asla yöntem eklemez. Yani JSON verilerini bir 'Kişi' nesnesi olarak örneklemelisiniz, bunun için bir yol yok. Nesneleri/dizileri sizin için anında oluşturmak için bir yardımcı fonksiyon yazabilirsiniz. Ve bu notta, döküm size bir dizi nesne ile nasıl yardımcı olur? Hala dizinin üzerinde yinelemek ve her bir öğeyi yayınlamak zorundasınız, değil mi? –