Vardığımdan daha iyi bir yol ararken bunu tökezledim. Cevapları okuyup denedikten sonra, diğer cevaplar benim için özlü hissetmediğinden, yaptığım şeyi göndermeye değer olduğunu düşündüm. Her yeni arayüz kurduğumda sadece kısa bir miktar kod yazmak benim için önemliydi. Karar verdim ...
Özel bir genel deepCopy işlevi kullanma:
deepCopy = <T extends {}>(input: any): T => {
return JSON.parse(JSON.stringify(input));
};
Arayüzünüzü tanımlayın
interface IX {
a: string;
b: any;
c: AnotherType;
}
... ve varsayılanları ayrı bir sabit olarak tanımlayın.
const XDef : IX = {
a: '',
b: null,
c: null,
};
Sonra şu şekilde başlayın:
let x : IX = deepCopy(XDef);
Tüm gereken bu ..
.. ancak ..
Herhangi bir kök öğesini özel olarak başlatmak istiyorsanız, deepCopy işlevini özel varsayılan değerleri kabul edecek şekilde değiştirebilirsiniz. İşlev şu hale gelir:
deepCopyAssign = <T extends {}>(input: any, rootOverwrites?: any): T => {
return JSON.parse(JSON.stringify({ ...input, ...rootOverwrites }));
};
Daha sonra bunun yerine şu şekilde çağrılabilir:
let x : IX = deepCopyAssign(XDef, { a:'customInitValue' } );
Tercih edilen başka herhangi bir derin kopyalama yöntemi işe yarayacaktır. Yalnızca basit bir kopya gerekiyorsa, yardımcı program deepCopyveya deepCopyAssignişleve olan ihtiyacı ortadan kaldıran Object.assign yeterli olacaktır .
let x : IX = object.assign({}, XDef, { a:'customInitValue' });
Bilinen Sorunlar
- Bu kılıkta derin bir görev vermeyecek, ancak değiştirmek çok zor değil
deepCopyAssign atamadan önce türleri yinelemek ve kontrol etmek .
- İşlevler ve referanslar ayrıştırma / dizgi işlemi tarafından kaybedilecektir. Görevim için bunlara ihtiyacım yok ve OP de yoktu.
- Özel init değerleri, yürütüldüğünde kontrol edilen IDE veya tür tarafından ima edilmez.