Я натрапив на це, шукаючи кращого шляху, ніж те, до чого я приїхав. Прочитавши відповіді та спробувавши їх, я подумав, що варто опублікувати те, що я роблю, оскільки інші відповіді не вважали мене стислими. Мені було важливо лише писати коротку кількість коду кожного разу, коли я встановлював новий інтерфейс. Я влаштувався на ...
Використання спеціальної загальної функції deepCopy:
deepCopy = <T extends {}>(input: any): T => {
return JSON.parse(JSON.stringify(input));
};
Визначте свій інтерфейс
interface IX {
a: string;
b: any;
c: AnotherType;
}
... і визначити параметри за замовчуванням в окремому const.
const XDef : IX = {
a: '',
b: null,
c: null,
};
Потім ініціюйте так:
let x : IX = deepCopy(XDef);
Це все, що потрібно ..
.. однак ..
Якщо ви хочете налаштувати ініціалізацію будь-якого кореневого елемента, ви можете змінити функцію deepCopy, щоб прийняти спеціальні значення за замовчуванням. Функція стає:
deepCopyAssign = <T extends {}>(input: any, rootOverwrites?: any): T => {
return JSON.parse(JSON.stringify({ ...input, ...rootOverwrites }));
};
Що потім можна назвати так:
let x : IX = deepCopyAssign(XDef, { a:'customInitValue' } );
Будь-який інший бажаний спосіб глибокої копії спрацював би. Якщо потрібна лише дрібна копія, то Object.assign буде достатньо, відмовляючись від необхідності утиліти deepCopyчи deepCopyAssignфункції.
let x : IX = object.assign({}, XDef, { a:'customInitValue' });
відомі проблеми
- Це не буде глибоко призначати в цій формі, але це не так складно змінити
deepCopyAssignітерацію та перевірку типів перед призначенням.
- Функції та посилання будуть втрачені процесом синтаксичного аналізу / строфікації. Мені це не потрібно для мого завдання, а також ОП.
- Користувацькі значення init не натякають IDE або тип перевіряється під час виконання.