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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:05:05