Me topé con esto mientras buscaba una forma mejor de lo que había llegado. Después de leer las respuestas y probarlas, pensé que valía la pena publicar lo que estaba haciendo, ya que las otras respuestas no me parecieron tan breves. Para mí era importante tener que escribir una pequeña cantidad de código cada vez que configuraba una nueva interfaz. Me decidí por ...
Usando una función personalizada de deepCopy genérica:
deepCopy = <T extends {}>(input: any): T => {
return JSON.parse(JSON.stringify(input));
};
Define tu interfaz
interface IX {
a: string;
b: any;
c: AnotherType;
}
... y define los valores predeterminados en una const separada.
const XDef : IX = {
a: '',
b: null,
c: null,
};
Entonces inicie así:
let x : IX = deepCopy(XDef);
Eso es todo lo que se necesita ...
.. sin embargo ..
Si desea inicializar cualquier elemento raíz , puede modificar la función deepCopy para aceptar valores predeterminados personalizados. La función se convierte en:
deepCopyAssign = <T extends {}>(input: any, rootOverwrites?: any): T => {
return JSON.parse(JSON.stringify({ ...input, ...rootOverwrites }));
};
Que luego se puede llamar así:
let x : IX = deepCopyAssign(XDef, { a:'customInitValue' } );
Cualquier otra forma preferida de copia profunda funcionaría. Si solo se necesita una copia superficial, Object.assign sería suficiente, renunciando a la necesidad de la utilidad deepCopyo deepCopyAssignfunción.
let x : IX = object.assign({}, XDef, { a:'customInitValue' });
Problemas conocidos
- No se asignará en profundidad de esta manera, pero no es demasiado difícil de modificar
deepCopyAssignpara iterar y verificar los tipos antes de asignar.
- El proceso de análisis / stringify perderá funciones y referencias. No los necesito para mi tarea y tampoco el OP.
- Los valores de inicio personalizados no son insinuados por el IDE o el tipo verificado cuando se ejecuta.