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

如何用同结构对象修改目标对象?TypeScript编译错误解决

解决TypeScript同结构对象循环赋值的编译错误

这段代码编译报错的核心原因是:TypeScript无法在for...in循环中跟踪propKey对应的具体属性类型,导致obj1[propKey]被推断为string | number(A所有属性类型的联合),而obj2[propKey]被推断为never(因为A不同属性的类型没有交集,交叉后为never),两者类型不兼容。

以下是几种可行的修改方案:

方案1:使用类型断言

直接通过类型断言告诉TypeScript当前赋值是类型安全的:

type A = { a: number, b: string };

let obj1: A = { a: 1, b: "1" };
let obj2: A = { a: 2, b: "2" };

let propKey: keyof A;

for (propKey in obj1) {
  obj2[propKey] = obj1[propKey] as typeof obj2[typeof propKey];
}

console.log(obj2); // 输出:{ a: 1, b: "1" }

方案2:封装泛型工具函数

借助泛型让TypeScript正确推断每个属性的类型,同时可以扩展额外逻辑:

type A = { a: number, b: string };

function assignSameStructProps<T>(target: T, source: T) {
  for (const key in source) {
    // 可选:排除原型链上的属性
    if (source.hasOwnProperty(key)) {
      target[key] = source[key];
    }
  }
}

let obj1: A = { a: 1, b: "1" };
let obj2: A = { a: 2, b: "2" };

assignSameStructProps(obj2, obj1);
console.log(obj2); // 输出:{ a: 1, b: "1" }

方案3:使用Object.assign(最简全量覆盖)

如果只是需要全量覆盖目标对象的属性,直接用TypeScript支持的内置API最简洁:

type A = { a: number, b: string };

let obj1: A = { a: 1, b: "1" };
let obj2: A = { a: 2, b: "2" };

Object.assign(obj2, obj1);
console.log(obj2); // 输出:{ a: 1, b: "1" }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:40:05