如何在TypeScript中遍历Pinia对象属性实现批量赋值?
TypeScript 批量设置对象所有布尔属性为 false 以简化 Pinia Store 赋值
你的场景是要给 Pinia Store 里的 showDeliveryLinesOptions 数组赋值,每个元素的 options 对象需要把所有布尔属性统一设为 false,不想手动逐个编写属性。可以用以下几种更灵活的方式实现:
方法一:利用 keyof 和 Object.fromEntries 动态生成
先提取 options 的类型,再通过 keyof 获取所有属性名,最终生成全为 false 的对象:
// 提取options的类型(从已有Store类型中推导) type DeliveryOptions = NonNullable<typeof detailsStore.showDeliveryLinesOptions>[number]['options']; // 封装生成默认options的函数 const createDefaultOptions = (): DeliveryOptions => { // 借助类型断言获取所有属性键 const keys = Object.keys({} as DeliveryOptions) as Array<keyof DeliveryOptions>; // 转成键值对数组后生成对象 return Object.fromEntries(keys.map(key => [key, false])) as DeliveryOptions; }; // 赋值时直接调用函数 detailsStore.showDeliveryLinesOptions = detailsStore.deliveries.map(delivery => ({ deliveryId: delivery.DeliveryId, options: createDefaultOptions() }));
这种方式的优势是:后续如果 DeliveryOptions 的属性有增减,代码无需手动修改,会自动适配新属性。
方法二:通用工具函数+类型约束
如果需要复用这类“全属性设为false”的逻辑,可以写一个通用工具函数:
// 通用工具函数:生成所有布尔属性为false的对象 const allFalse = <T extends Record<string, boolean>>(): T => { const obj = {} as T; // 遍历目标类型的所有属性键 for (const key in {} as T) { obj[key] = false; } return obj; }; // 赋值时指定类型调用 type DeliveryOptions = NonNullable<typeof detailsStore.showDeliveryLinesOptions>[number]['options']; detailsStore.showDeliveryLinesOptions = detailsStore.deliveries.map(delivery => ({ deliveryId: delivery.DeliveryId, options: allFalse<DeliveryOptions>() }));
方法三:内联简化写法
如果不想额外封装函数,也可以直接在 map 回调里生成:
type DeliveryOptions = NonNullable<typeof detailsStore.showDeliveryLinesOptions>[number]['options']; detailsStore.showDeliveryLinesOptions = detailsStore.deliveries.map(delivery => { const options = {} as DeliveryOptions; (Object.keys({} as DeliveryOptions) as Array<keyof DeliveryOptions>).forEach(key => { options[key] = false; }); return { deliveryId: delivery.DeliveryId, options }; });
内容的提问来源于stack exchange,提问作者Jaisy
相关产品推荐
相关产品推荐

