TypeScript从含嵌套对象的同类型对象创建新对象时类型报错解决
解决TypeScript复制嵌套对象时的类型不匹配问题
这个错误的根源是TypeScript在循环里没法自动对应key的具体类型——key是'f1'|'f2'的联合类型,itemShort[key]的类型是Itext|Ibool,但你生成的{value: insKey.value}被推断成了{value: string|boolean},这俩类型没法直接匹配,所以TS抛出了never类型的错误。
下面是几种可行的解决方式:
方法一:用类型断言明确当前key对应的类型
在赋值时直接断言当前创建的对象就是itemShort[key]对应的类型,让TS明确类型匹配关系:
const itemShort = {} as IForm; let key: keyof typeof itemFull; for (key in itemFull) { const insKey = itemFull[key]; if (insKey !== undefined) { // 断言为当前key对应的目标类型 itemShort[key] = { value: insKey.value } as typeof itemShort[key]; } }
方法二:用泛型函数处理单个属性
通过泛型函数让TS为每个key单独推断类型,避免联合类型的歧义:
function pickValue<K extends keyof IForm>(key: K, obj: IForm): IForm[K] { return { value: obj[key].value } as IForm[K]; } const itemShort = {} as IForm; for (const key in itemFull) { const typedKey = key as keyof IForm; itemShort[typedKey] = pickValue(typedKey, itemFull as IForm); }
方法三:用Object.fromEntries简化处理
把对象转为键值对数组处理后再转回对象,同时通过类型断言保证最终类型正确:
const itemShort = Object.fromEntries( Object.entries(itemFull).map(([key, val]) => [key, { value: val.value }]) ) as IForm;
这种方式代码更简洁,适合简单的属性提取场景。
内容的提问来源于stack exchange,提问作者Alexey Zhuchkov
相关产品推荐
相关产品推荐

