如何让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
相关产品推荐
相关产品推荐

