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

如何让TypeScript识别同类型对象动态赋值时的类型同步?

TypeScript动态更新同类型对象属性的类型同步问题解决办法

问题场景

我们有两个同类型的对象,需要通过索引数组动态更新目标对象的属性,但TypeScript无法识别同索引下两个对象的类型同步,导致类型推断错误:

type TypeOne = 'good' | 'okay';
type TypeTwo = 'default' | 'one';

interface Option {
  year: TypeOne,
  date?: TypeTwo
}

const currentData: Option = {
  year: 'good',
  date: 'default'
}

const newData: Option = {
  year: 'okay',
}

const params: (keyof typeof currentData)[] = ['year', 'date'];

// 报错:currentData[param]被推断为never类型
params.forEach((param) => {
  currentData[param] = newData[param]; 
});

问题核心:TypeScript无法推断出currentData[param]和newData[param]的类型完全匹配,因为param是keyof Option的联合类型,TypeScript会将两者的类型交集作为推断结果,而TypeOne和TypeTwo的交集是never,所以出现错误。

解决方法

方法一:使用类型断言

直接通过类型断言告诉TypeScript,newData[param]的类型与currentData[param]匹配,适用于确定两个对象类型完全一致的场景:

params.forEach((param) => {
  currentData[param] = newData[param] as typeof currentData[param];
});

方法二:泛型函数锁定属性类型

通过泛型函数单独处理每个属性的更新,让TypeScript为每个具体的属性key推断出对应的类型,确保类型同步:

function updateSingleProp<K extends keyof Option>(target: Option, source: Option, key: K) {
  // 处理可选属性:如果source的key不存在,不执行更新
  if (source[key] === undefined) return;
  target[key] = source[key] as Option[K];
}

params.forEach((param) => {
  updateSingleProp(currentData, newData, param);
});

方法三:对象扩展生成新对象

如果不需要修改原对象,直接使用对象扩展运算符合并两个对象,这种方式最简洁且类型安全:

const updatedData = { ...currentData, ...newData };

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:02:42