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 <noreply@anthropic.com>
This commit is contained in:
2026-03-25 16:59:24 +08:00
parent 64893e7dad
commit a8949d9abf
+12 -11
View File
@@ -792,21 +792,22 @@ export function ReviewSettings({
// 渲染字段标签,确保已选择的字段即使在新的字段列表中不存在也会显示
const renderFieldTags = (ruleId: string, config: Record<string, unknown>) => {
// 获取规则的当前已选字段
// 修复:对于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 (
<div className="field-tags">
{fieldsToRender.map((field, index) => {
// 使用includes方法检查选中状态
// 使用includes方法检查选中状态selectedFields 总是数组,不会抛错)
const isSelected = selectedFields.includes(field);
return (