You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中删除obj2中已存在于obj1的键并合并对象?

合并对象:保留第一个对象全属性,仅追加第二个对象独有属性

你的需求是合并两个对象,最终结果要包含第一个对象的所有属性,同时只加入第二个对象里第一个对象没有的属性。你写的代码思路没问题,但可以从类型安全性和代码简洁性两方面优化:

原代码的问题点

  1. 使用object类型会丢失具体的键值类型信息,TypeScript无法推导合并后对象的准确类型;
  2. 遍历删除属性的方式略显繁琐,还会修改临时拷贝的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:01:45