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

如何在TypeScript中使用reduce生成符合指定类型的对象并填充数组?

解决办法

方法1:补全初始值的必填属性默认值

既然ProductsList的所有属性都是必填类型,直接给reduce的初始值设置符合类型要求的默认值即可,后续reduce仅更新已有字段:

// 初始值完全匹配ProductsList类型
const initialData: ProductsList = {
  id: 0,
  nome: '',
  qtde: 0,
  valor: 0,
  valorTotal: 0
}

const productValues = productFormLocal.reduce((obj, item) => {
  // 约束field只能是ProductsList的属性名,避免无效字段
  obj[item.field as keyof ProductsList] = item.config.value as any;
  return obj;
}, initialData)

productsList.push(productValues)

方法2:用Partial过渡+补全缺失属性

借助Partial<ProductsList>让初始值可以为空对象,reduce完成后再补全所有必填属性:

// Partial将ProductsList的所有属性转为可选,允许初始值为空
const productValues = productFormLocal.reduce((obj, item) => {
  obj[item.field as keyof ProductsList] = item.config.value as any;
  return obj;
}, {} as Partial<ProductsList>)

// 补全剩余必填属性,确保最终对象符合类型要求
const completeProduct: ProductsList = {
  qtde: 0,
  valor: 0,
  valorTotal: 0,
  ...productValues
}

productsList.push(completeProduct)

方法3:类型守卫做严谨校验

如果需要确保运行时类型安全,可以编写类型守卫函数,校验通过后再推入数组:

// 类型守卫函数:校验对象是否符合ProductsList类型
function isProductsList(obj: any): obj is ProductsList {
  return (
    typeof obj.id === 'number' &&
    typeof obj.nome === 'string' &&
    typeof obj.qtde === 'number' &&
    typeof obj.valor === 'number' &&
    typeof obj.valorTotal === 'number'
  )
}

const productValues = productFormLocal.reduce((obj, item) => {
  obj[item.field] = item.config.value;
  return obj;
}, {} as Record<string, any>)

// 校验通过才推入数组,避免类型错误
if (isProductsList(productValues)) {
  productsList.push(productValues)
} else {
  console.error('生成的对象不符合ProductsList类型,请检查字段赋值')
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:30:42