Typescript - 按值自定义类型分配

Typescript - Custom type assignment by value

在我的一个过程中,我需要定期重置自定义类型,但我注意到在 TypeScript 中(我认为 JavaScript 也可能如此),当我将自定义类型的变量分配给另一个时相同类型的变量,赋值是通过引用而不是值。

例如这段代码:

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);

生成此输出

{ a: 'one', b: 1 }
{ a: 'two', b: 2 }
{ a: 'Edited', b: 2 }
{ a: 'Edited', b: 2 }

有没有一种方法可以按值分配它而不分配每个 属性 类型?

(在我的示例中,我需要我的 v2 变量保持等于 { a: "two", b: 2 })

对于像这样的简单情况,您可以使用展开运算符创建对象的浅表副本。

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);

注意这里有一些注意事项。正如 Tobias S 评论中的 link 所示,这只会进行浅拷贝。如果您有更复杂的对象,这将导致问题。

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.c.d = 60;

console.log(v1);
console.log(v2);