En uno de mis procedimientos, necesito restablecer periódicamente un tipo personalizado, pero noté que en TypeScript (y creo que también en JavaScript), cuando asigno una variable de un tipo personalizado a otra variable del mismo tipo, la asignación es hecho por referencia y no por valor.
Por ejemplo este código:
type testing = { a: string; b: number; }; let v1: testing = { a: "one", b: 1 }; let v2: testing = { a: "two", b: 2 }; console.log(v1); console.log(v2); v1 = v2; v1.a = "Edited"; console.log(v1); console.log(v2);genera esta salida
{ a: 'one', b: 1 } { a: 'two', b: 2 } { a: 'Edited', b: 2 } { a: 'Edited', b: 2 }¿Hay alguna forma de asignarlo por valor sin asignar todas las propiedades del tipo?
(en mi ejemplo, necesito que mi variable v2 permanezca igual a {a: "dos", b: 2})
Para casos simples como este, puede utilizar el operador de extensión para crear una copia superficial de un objeto.
type testing = { a: string; b: number; }; let v1: testing = { a: "one", b: 1 }; let v2: testing = { a: "two", b: 2 }; console.log(v1); console.log(v2); // copy all of the top-level keys and values from v2 // into a new object and assign that to v1 v1 = { ...v2 }; v1.a = "Edited"; console.log(v1); console.log(v2);Tenga en cuenta que hay algunas advertencias aquí. Como lo indica el enlace en el comentario de Tobias S, esto solo hará una copia superficial. Si tiene objetos más complejos, esto causará problemas.
let v1: testing = { a: "one", b: 1, c: { d: 1 } }; let v2: testing = { a: "two", b: 2, c: { d: 2 } }; v2 = { ...v1 }; // v1.c is the same object as v2.c because we only shallowly // copied, so this assignment is reflected in both v2.cd = 60; console.log(v1); console.log(v2);