如何在TypeScript中实现对象间同名属性值的复制?
实现TypeScript的属性复制函数fillValuesFromObject
需求很明确:我们有Object1和Object2两个类,要写一个fillValuesFromObject函数,把Object2实例中与Object1同名的属性值复制到Object1实例里,自动忽略Object2的额外属性和方法。
下面提供两种实用的实现方式:
方式一:通用泛型实现(推荐)
这种方式不需要硬编码属性名,不管Object1的属性后续怎么修改,函数都能正常工作,通用性强:
function fillValuesFromObject<T extends object, U extends object>(target: T, source: U): void { // 遍历目标对象的所有可枚举属性键 Object.keys(target).forEach(key => { // 确认源对象包含该属性后再赋值,避免覆盖为undefined if (key in source) { (target as Record<string, unknown>)[key] = source[key as keyof U]; } }); }
原理说明
- 用泛型
T和U约束输入的目标对象和源对象都是合法的对象类型 - 通过
Object.keys(target)获取Object1实例的所有属性键,确保只处理Object1存在的属性 - 检查源对象
Object2是否包含该属性,存在则赋值给目标对象,自动跳过time、frame这类额外属性以及方法
方式二:手动解构赋值(适合属性固定的场景)
如果Object1的属性很少且不会频繁变更,直接解构赋值更直观:
function fillValuesFromObject(target: Object1, source: Object2): void { // 只提取需要的属性 const { name, value, desc } = source; // 赋值给目标对象 Object.assign(target, { name, value, desc }); }
原理说明
- 从
Object2实例中解构出Object1拥有的三个属性 - 用
Object.assign把这些属性值批量赋值给Object1实例,自动忽略其他属性
验证效果
调用函数后,object1的输出会和预期一致:
name: "test", value: 5, desc: "testDesc"
Object2中的time、frame属性以及方法都会被忽略。
内容的提问来源于stack exchange,提问作者sirzento
相关产品推荐
相关产品推荐

