如何在TypeScript中删除obj2中已存在于obj1的键并合并对象?
合并对象:保留第一个对象全属性,仅追加第二个对象独有属性
你的需求是合并两个对象,最终结果要包含第一个对象的所有属性,同时只加入第二个对象里第一个对象没有的属性。你写的代码思路没问题,但可以从类型安全性和代码简洁性两方面优化:
原代码的问题点
- 使用
object类型会丢失具体的键值类型信息,TypeScript无法推导合并后对象的准确类型; - 遍历删除属性的方式略显繁琐,还会修改临时拷贝的
secondObj对象。
优化后的代码
function mergeObjects<T extends object, U extends object>(obj1: T, obj2: U): T & Omit<U, keyof T> { // 筛选出obj2中obj1没有的键值对,重新生成对象 const uniqueObj2 = Object.fromEntries( Object.entries(obj2).filter(([key]) => !(key in obj1)) ) as Omit<U, keyof T>; return { ...obj1, ...uniqueObj2 }; }
优化说明
- 泛型约束:用
T和U分别定义两个输入对象的类型,返回类型T & Omit<U, keyof T>能精准描述合并结果——既包含T的所有属性,又只保留U中不属于T的属性; - 更简洁的过滤逻辑:用
Object.entries把对象转成键值对数组,过滤后再用Object.fromEntries还原成对象,避免了遍历删除的操作; - 类型断言:
as Omit<U, keyof T>让TypeScript正确识别筛选后的对象类型,避免类型报错。
使用示例
const obj1 = { name: "张三", age: 28 }; const obj2 = { age: 30, city: "北京", occupation: "程序员" }; const mergedObj = mergeObjects(obj1, obj2); // mergedObj的类型:{ name: string; age: number; } & { city: string; occupation: string; } // mergedObj的实际值:{ name: '张三', age: 28, city: '北京', occupation: '程序员' }
内容的提问来源于stack exchange,提问作者mitattt
相关产品推荐
相关产品推荐

