Eu tropecei nisso enquanto procurava uma maneira melhor do que aquilo que eu havia chegado. Depois de ler as respostas e experimentá-las, achei que valia a pena postar o que estava fazendo, pois as outras respostas não me pareciam sucintas. Era importante para mim ter que escrever apenas uma pequena quantidade de código toda vez que eu configurava uma nova interface. Eu decidi ...
Usando uma função deepCopy genérica customizada:
deepCopy = <T extends {}>(input: any): T => {
return JSON.parse(JSON.stringify(input));
};
Defina sua interface
interface IX {
a: string;
b: any;
c: AnotherType;
}
... e defina os padrões em uma const separada.
const XDef : IX = {
a: '',
b: null,
c: null,
};
Então inicie assim:
let x : IX = deepCopy(XDef);
Isso é tudo o que é necessário ..
.. Contudo ..
Se você deseja inicializar personalizado qualquer elemento raiz, pode modificar a função deepCopy para aceitar valores padrão personalizados. A função se torna:
deepCopyAssign = <T extends {}>(input: any, rootOverwrites?: any): T => {
return JSON.parse(JSON.stringify({ ...input, ...rootOverwrites }));
};
Que pode ser chamado assim:
let x : IX = deepCopyAssign(XDef, { a:'customInitValue' } );
Qualquer outra maneira preferida de cópia profunda funcionaria. Se apenas uma cópia superficial for necessária, o Object.assign será suficiente, renunciando à necessidade do utilitário deepCopyou deepCopyAssignfunção.
let x : IX = object.assign({}, XDef, { a:'customInitValue' });
Problemas conhecidos
- Ela não será atribuída em profundidade nessa aparência, mas não é muito difícil modificar
deepCopyAssignpara iterar e verificar os tipos antes da atribuição.
- Funções e referências serão perdidas pelo processo de análise / stringify. Não preciso disso para minha tarefa e nem o OP.
- Os valores personalizados do init não são sugeridos pelo IDE ou pelo tipo verificado quando executado.