Natknąłem się na to, szukając lepszego sposobu niż to, do czego dotarłem. Po przeczytaniu odpowiedzi i wypróbowaniu ich pomyślałem, że warto opublikować, co robię, ponieważ inne odpowiedzi nie wydawały mi się tak zwięzłe. Zależało mi na tym, aby za każdym razem, gdy konfigurowałem nowy interfejs, napisać niewielką ilość kodu. Zdecydowałem się na ...
Korzystanie z niestandardowej ogólnej funkcji deepCopy:
deepCopy = <T extends {}>(input: any): T => {
return JSON.parse(JSON.stringify(input));
};
Zdefiniuj swój interfejs
interface IX {
a: string;
b: any;
c: AnotherType;
}
... i zdefiniuj wartości domyślne w oddzielnej stałej.
const XDef : IX = {
a: '',
b: null,
c: null,
};
Następnie uruchom w ten sposób:
let x : IX = deepCopy(XDef);
To wszystko, czego potrzeba ...
.. jednak ..
Jeśli chcesz niestandardowo zainicjować dowolny element główny , możesz zmodyfikować funkcję deepCopy, aby akceptowała niestandardowe wartości domyślne. Funkcja staje się:
deepCopyAssign = <T extends {}>(input: any, rootOverwrites?: any): T => {
return JSON.parse(JSON.stringify({ ...input, ...rootOverwrites }));
};
Który można wtedy nazwać w ten sposób:
let x : IX = deepCopyAssign(XDef, { a:'customInitValue' } );
Każdy inny preferowany sposób głębokiego kopiowania zadziała. Gdyby potrzebna była tylko płytka kopia, wystarczyłby Object. assign, który zrezygnowałby z narzędzia deepCopylub deepCopyAssignfunkcji.
let x : IX = object.assign({}, XDef, { a:'customInitValue' });
Znane problemy
- Nie będzie to głęboko przypisywane w tym przebraniu, ale nie jest zbyt trudne do zmodyfikowania,
deepCopyAssignaby iterować i sprawdzać typy przed przypisaniem.
- Funkcje i odwołania zostaną utracone w procesie analizy / określania parametrów. Nie potrzebuję ich do mojego zadania, podobnie jak OP.
- Niestandardowe wartości inicjalizacji nie są podpowiadane przez środowisko IDE ani typ sprawdzany podczas wykonywania.