Ich stolperte darüber, als ich nach einem besseren Weg suchte als dem, zu dem ich gekommen war. Nachdem ich die Antworten gelesen und ausprobiert hatte, dachte ich, es lohnt sich zu posten, was ich tat, da sich die anderen Antworten für mich nicht so prägnant anfühlten. Es war mir wichtig, jedes Mal, wenn ich eine neue Schnittstelle einrichte, nur eine kurze Menge Code schreiben zu müssen. Ich entschied mich für ...
Verwenden einer benutzerdefinierten generischen deepCopy-Funktion:
deepCopy = <T extends {}>(input: any): T => {
return JSON.parse(JSON.stringify(input));
};
Definieren Sie Ihre Schnittstelle
interface IX {
a: string;
b: any;
c: AnotherType;
}
... und definieren Sie die Standardeinstellungen in einer separaten Konstante.
const XDef : IX = {
a: '',
b: null,
c: null,
};
Dann Init wie folgt:
let x : IX = deepCopy(XDef);
Das ist alles was benötigt wird ..
.. jedoch ..
Wenn Sie ein Stammelement benutzerdefiniert initialisieren möchten, können Sie die deepCopy-Funktion so ändern, dass benutzerdefinierte Standardwerte akzeptiert werden. Die Funktion wird:
deepCopyAssign = <T extends {}>(input: any, rootOverwrites?: any): T => {
return JSON.parse(JSON.stringify({ ...input, ...rootOverwrites }));
};
Was dann stattdessen so genannt werden kann:
let x : IX = deepCopyAssign(XDef, { a:'customInitValue' } );
Jede andere bevorzugte Art der Tiefenkopie würde funktionieren. Wenn nur eine flache Kopie benötigt wird, würde Object.assign ausreichen und auf die Notwendigkeit des Dienstprogramms deepCopy
oder der deepCopyAssign
Funktion verzichten.
let x : IX = object.assign({}, XDef, { a:'customInitValue' });
Bekannte Probleme
- In dieser Form wird es nicht tief zugewiesen, aber es ist nicht allzu schwierig, Änderungen
deepCopyAssign
vorzunehmen, um Typen vor dem Zuweisen zu iterieren und zu überprüfen.
- Funktionen und Referenzen gehen beim Parse / Stringify-Prozess verloren. Ich brauche diese nicht für meine Aufgabe und das OP auch nicht.
- Benutzerdefinierte Init-Werte werden von der IDE oder dem Typ, der bei der Ausführung überprüft wird, nicht angedeutet.