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

