如何仅替换两个对象中共同键的值并保留其余内容(解决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
相关产品推荐
相关产品推荐

