Typescript interface对象赋值引用还是拷贝的问题

在 TypeScript 中,将一个接口对象赋值给另一个变量时,实际上是传递引用而不是进行数据拷贝。也就是说,两个变量都引用同一个对象,因此对其中一个变量进行修改会影响到另一个变量。

示例

假设我们有一个接口 FontSizeEntity

interface FontSizeEntity {
  size: number;
  unit: string;
}

const fontSize: FontSizeEntity = {
  size: 16,
  unit: 'px'
};

// 将 fontSize 赋值给另一个变量
const anotherFontSize = fontSize;

console.log(anotherFontSize); // { size: 16, unit: 'px' }

// 修改 anotherFontSize 会影响 fontSize,因为它们引用的是同一个对象
anotherFontSize.size = 20;

console.log(fontSize); // { size: 20, unit: 'px' }
console.log(anotherFontSize); // { size: 20, unit: 'px' }

解释

  • 传引用: 当我们将 fontSize 赋值给 anotherFontSize 时,anotherFontSize 只是对 fontSize 所引用的同一个对象的引用。因此,对 anotherFontSize 的任何修改都会反映在 fontSize 上,反之亦然。

  • 数据拷贝: 如果你希望创建一个新对象,并且与原对象相互独立,则需要进行数据拷贝。这可以通过对象展开操作符(spread operator)或其他方法来实现。

数据拷贝示例

如果你希望赋值时进行数据拷贝,可以使用对象展开操作符(spread operator):

interface FontSizeEntity {
  size: number;
  unit: string;
}

const fontSize: FontSizeEntity = {
  size: 16,
  unit: 'px'
};

// 创建一个新的对象,进行浅拷贝
const anotherFontSize = { ...fontSize };

console.log(anotherFontSize); // { size: 16, unit: 'px' }

// 修改 anotherFontSize 不会影响 fontSize,因为它们是两个独立的对象
anotherFontSize.size = 20;

console.log(fontSize); // { size: 16, unit: 'px' }
console.log(anotherFontSize); // { size: 20, unit: 'px' }

深拷贝

对于嵌套对象的深拷贝,可以使用 JSON.parseJSON.stringify 或者 lodash 库中的 cloneDeep 方法:

import _ from 'lodash';

interface FontSizeEntity {
  size: number;
  unit: string;
  details?: {
    fontWeight: string;
  };
}

const fontSize: FontSizeEntity = {
  size: 16,
  unit: 'px',
  details: {
    fontWeight: 'bold'
  }
};

// 使用 lodash 的 cloneDeep 方法进行深拷贝
const anotherFontSize = _.cloneDeep(fontSize);

console.log(anotherFontSize); // { size: 16, unit: 'px', details: { fontWeight: 'bold' } }

// 修改 anotherFontSize 的嵌套属性不会影响 fontSize,因为它们是两个独立的对象
anotherFontSize.details!.fontWeight = 'normal';

console.log(fontSize.details); // { fontWeight: 'bold' }
console.log(anotherFontSize.details); // { fontWeight: 'normal' }

总结

  • 传引用: 默认情况下,赋值操作是传递引用。
  • 浅拷贝: 使用对象展开操作符 { ...obj } 可以进行浅拷贝。
  • 深拷贝: 使用 JSON.parse(JSON.stringify(obj))lodashcloneDeep 方法进行深拷贝。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: TypeScript 接口是一种用于描述对象形状的语法结构,它可以定义对象的属性、方法、函数等,以及它们的类型和参数。接口可以用来约束函数的输入和输出,也可以用来定义类的成员。接口可以被继承和实现,从而实现代码的复用和灵活性。在 TypeScript 中,接口是一种非常重要的语言特性,它可以帮助我们更好地组织和管理代码。 ### 回答2: TypeScript中的接口(interface)是用于定义对象的结构和类型的一种语法。接口可以用来描述一个对象应该具有的属性和方法,相当于定义了一个规范。 在TypeScript中,通过interface关键字来声明一个接口。接口可以包含属性、函数、索引器和其他接口等。例如: ```typescript interface Person { name: string; age: number; sayHello(): void; } const person: Person = { name: "Alice", age: 20, sayHello() { console.log("Hello!"); } }; person.sayHello(); // 输出"Hello!" ``` 上述代码中,我们定义了一个名为Person的接口,它包含了name属性(类型为string)、age属性(类型为number)和sayHello方法(没有返回值)。然后,我们创建了一个符合Person接口规范的对象,并调用了sayHello方法。 接口的好处在于它可以提供类型检查,确保我们使用的对象符合接口的定义。如果一个对象不满足接口的要求,TypeScript会在编译时报错。这样可以在开发过程中避免一些常见的错误。 接口还可以用来描述函数类型、类类型等。它可以作为类型注解使用,对函数的输入参数和返回值进行约束,或者用于定义类的实例部分和静态部分的类型。 总而言之,TypeScript的接口是一种强大的工具,它可以帮助我们在开发过程中更好地定义和约束对象的结构和类型,提高了代码的可读性和可维护性。 ### 回答3: TypeScript中的接口(interface)是用来定义对象的结构和类型的。接口可以定义对象的属性、方法和可选属性等。 通过接口的方式可以明确定义一个对象应该具有的属性和方法,以及它们的类型。一旦定义了接口,就可以使用它来强制对象符合这个接口定义的结构。 接口的定义与类的定义有些类似,但是接口是一种抽象的概念,不能直接被实例化。它可以被类、对象、函数等来实现或者继承。当一个类实现了一个接口时,它必须实现接口中定义的所有属性和方法。 使用接口可以有效地帮助我们进行代码的重用和维护。当一个对象需要满足多个接口时,可以使用逗号将多个接口名进行分隔,在该对象中实现这些接口定义的属性和方法。 同时,接口还可以用来定义函数的参数类型和返回值类型。通过指定函数参数和返回值的接口定义,可以限制函数的使用范围,并提供更明确的类型检查。 总结起来,TypeScript中的接口是用来定义对象结构和类型的一种机制。它可以帮助我们明确对象的属性和方法,并提供类型检查。使用接口可以增加代码的可读性、可维护性,并提高代码的重用性和健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ArslanRobot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值