Я наткнулся на это, ища лучший способ, чем тот, к которому я пришел. Прочитав ответы и попробовав их, я подумал, что стоит опубликовать то, что я делаю, поскольку другие ответы не казались мне такими лаконичными. Для меня было важно писать небольшой объем кода каждый раз, когда я настраиваю новый интерфейс. Я остановился на ...
Использование настраиваемой универсальной функции deepCopy:
deepCopy = <T extends {}>(input: any): T => {
return JSON.parse(JSON.stringify(input));
};
Определите свой интерфейс
interface IX {
a: string;
b: any;
c: AnotherType;
}
... и определите значения по умолчанию в отдельной константе.
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для итерации и проверки типов перед назначением.
- Функции и ссылки будут потеряны в процессе синтаксического анализа / преобразования в строку. Мне они не нужны для моей задачи, и OP тоже.
- Пользовательские значения инициализации не подсказываются IDE и не проверяются при выполнении.