fix(frontend): comprehensive defensive guards in ReviewSettings

Multiple locations in ReviewSettings.tsx call .includes() or .filter()
on variables that could theoretically be non-arrays:

1. availableFields.filter/.includes - added safeAvailableFields guard
2. newFields.map field.includes('_') - added typeof===string guard + filter
3. (prior fix) cfgAvailableFields includes/every in renderRuleConfig
4. (prior fix) selectedFields includes in renderFieldTags

These prevent TypeError crashes when config objects contain unexpected
types (e.g. {} instead of []) from stale API data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-25 17:29:21 +08:00
parent 804e24eff9
commit aec34d139a
+14 -11
View File
@@ -387,11 +387,12 @@ export function ReviewSettings({
// 去重
const uniqueFields = [...new Set(processedFields)];
// 检查是否有字段被删除
const deletedFields = availableFields.filter(field => !uniqueFields.includes(field));
// 检查是否有字段被删除(防御性:确保availableFields是数组)
const safeAvailableFields: string[] = Array.isArray(availableFields) ? availableFields : [];
const deletedFields = safeAvailableFields.filter(field => !uniqueFields.includes(field));
// 处理新增的字段
const newFields = uniqueFields.filter((field: string) => !availableFields.includes(field));
const newFields = uniqueFields.filter((field: string) => !safeAvailableFields.includes(field));
if (newFields.length > 0 || deletedFields.length > 0) {
// console.log('Updating fields in checkAndUpdateFields - deleted:', deletedFields, 'new:', newFields);
@@ -538,13 +539,15 @@ export function ReviewSettings({
const updatedConfig = { ...rule.config };
// 对所有规则类型都更新availableFields字段
// 处理字段,只保留字段名,去掉类型后缀
const processedFields = newFields.map(field => {
if (field.includes('_')) {
return field.split('_')[0]; // 只保留类型前面的字段名
}
return field;
});
// 处理字段,只保留字段名,去掉类型后缀(防御性:确保field是字符串)
const processedFields = newFields
.filter(field => typeof field === 'string')
.map(field => {
if (field.includes('_')) {
return field.split('_')[0];
}
return field;
});
// 去重
const uniqueFields = [...new Set(processedFields)];