From a8949d9abfd97b6d5615d918bd3110eba416aaf0 Mon Sep 17 00:00:00 2001 From: wren Date: Wed, 25 Mar 2026 16:59:24 +0800 Subject: [PATCH] fix(frontend): guard against non-array selectedFields in renderFieldTags When config.fields is a non-array value (e.g. empty object {}), the fallback logic could still result in a non-array if both config.fields and config.selectedFields are abnormal values. Added double-guard: after the fallback chain, explicitly assert Array.isArray before using selectedFields.includes(). Fixes: TypeError: _.includes is not a function on rules/new page. Co-Authored-By: Claude Opus 4.6 --- app/components/rules/new/ReviewSettings.tsx | 23 +++++++++++---------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/app/components/rules/new/ReviewSettings.tsx b/app/components/rules/new/ReviewSettings.tsx index dd4dc3c..4943150 100644 --- a/app/components/rules/new/ReviewSettings.tsx +++ b/app/components/rules/new/ReviewSettings.tsx @@ -792,21 +792,22 @@ export function ReviewSettings({ // 渲染字段标签,确保已选择的字段即使在新的字段列表中不存在也会显示 const renderFieldTags = (ruleId: string, config: Record) => { - // 获取规则的当前已选字段 - // 修复:对于exists类型规则,应该使用fields而不是selectedFields - const selectedFields = Array.isArray(config.fields) ? - config.fields as string[] : - (Array.isArray(config.selectedFields) ? config.selectedFields as string[] : []); - + // 获取规则的当前已选字段(防御性:确保总是数组) + const rawSelected = Array.isArray(config.fields) + ? config.fields + : (Array.isArray(config.selectedFields) ? config.selectedFields : []); + const selectedFields: string[] = Array.isArray(rawSelected) ? rawSelected : []; + // 优先使用配置中存储的可用字段,如果没有则使用当前可用字段 - const fieldsToRender = Array.isArray(config.availableFields) ? - config.availableFields as string[] : - availableFields; - + const rawFieldsToRender = Array.isArray(config.availableFields) + ? config.availableFields + : availableFields; + const fieldsToRender: string[] = Array.isArray(rawFieldsToRender) ? rawFieldsToRender : []; + return (
{fieldsToRender.map((field, index) => { - // 使用includes方法检查选中状态 + // 使用includes方法检查选中状态(selectedFields 总是数组,不会抛错) const isSelected = selectedFields.includes(field); return (