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

如何仅替换两个对象中共同键的值并保留其余内容(解决TypeScript类型错误)

仅替换两个对象共有键的值(不新增键)

刚好我之前也碰到过类似的需求,咱们一步步来解决你的问题:

一、JavaScript实现(精准满足需求)

你原来的代码会把obj2的所有键都加到obj1里,核心问题就是没做「键是否存在于obj1」的判断。只需要加一个k in obj1的条件过滤,就能实现你要的效果:

const obj1 = { a: 'replace a', b: 'keep b' };
const obj2 = { a: 'new value a', c: 'ignore c' };

for (const [k, v] of Object.entries(obj2)) {
  // 只处理obj1中已经存在的键
  if (k in obj1) {
    obj1[k] = v;
  }
}

console.log(obj1); // { a: 'new value a', b: 'keep b' }

这样一来,obj2里的c因为不在obj1中,就会被直接忽略,完美匹配你的预期。

二、TypeScript类型错误解决

你遇到的类型报错,是因为TypeScript无法确定Object.entries(obj2)返回的键k是否是obj1的合法索引。这里有两种靠谱的解决方式:

方式1:类型断言+存在性判断

直接在原代码基础上,给k加上类型断言,告诉TypeScript它是obj1的键类型:

// 先定义obj1的类型
type Obj1 = typeof obj1;

const obj1: Obj1 = { a: 'replace a', b: 'keep b' };
const obj2 = { a: 'new value a', c: 'ignore c' };

for (const [k, v] of Object.entries(obj2)) {
  if (k in obj1) {
    // 断言k属于Obj1的键类型
    obj1[k as keyof Obj1] = v;
  }
}

方式2:从obj1的键出发(更安全)

换个遍历方向,先拿到obj1的所有键,再去obj2里找对应值替换。这种方式完全符合TypeScript的类型推导,不需要额外断言:

const obj1 = { a: 'replace a', b: 'keep b' };
const obj2 = { a: 'new value a', c: 'ignore c' };

// 把obj1的键转换成明确的类型:keyof typeof obj1
const obj1Keys = Object.keys(obj1) as (keyof typeof obj1)[];

// 遍历obj1的键,只替换obj2中存在的对应值
obj1Keys.forEach(key => {
  if (key in obj2) {
    obj1[key] = obj2[key];
  }
});

这种方式更推荐,因为它从根源上避免了类型不确定的问题,代码逻辑也更直观。

内容的提问来源于stack exchange,提问作者MissJulie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:04:10