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);
在我的一个过程中,我需要定期重置自定义类型,但我注意到在 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);