From f94a01e0a11952cd808cf5e1be467cb1f8cd4c7a Mon Sep 17 00:00:00 2001 From: wc24 Date: Mon, 15 Jun 2026 14:34:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(shrimp):=20=E4=BF=AE=E5=A4=8D=20multiple=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E7=B1=BB=E5=9E=8B=E6=A0=A1=E9=AA=8C=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Shrimp/ShrimpTableModule.ts | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/Shrimp/ShrimpTableModule.ts b/src/Shrimp/ShrimpTableModule.ts index 48263b6..c4b8b35 100644 --- a/src/Shrimp/ShrimpTableModule.ts +++ b/src/Shrimp/ShrimpTableModule.ts @@ -114,21 +114,20 @@ export class ShrimpTableModule = ITableCrudProto } } - switch (field.type) { - case ShrimpFieldTypes.String: - if (typeof value !== 'string') return { t: 'shrimp.fieldTypeError', params: { field: field.label } } - break - case ShrimpFieldTypes.Number: - if (typeof value !== 'number' || Number.isNaN(value)) return { t: 'shrimp.fieldTypeError', params: { field: field.label } } - break - case ShrimpFieldTypes.Boolean: - if (typeof value !== 'boolean') return { t: 'shrimp.fieldTypeError', params: { field: field.label } } - break - case ShrimpFieldTypes.Date: - if (typeof value !== 'number' && !(value instanceof Date) && isNaN(Date.parse(value))) { - return { t: 'shrimp.fieldTypeError', params: { field: field.label } } - } - break + // multiple 字段值是数组,类型校验需逐元素进行(与上面 options 校验保持一致); + // 非 multiple 则整体校验单值。否则数组会被标量类型分支整体判为类型错误。 + const checkType = (v: any): boolean => { + switch (field.type) { + case ShrimpFieldTypes.String: return typeof v === 'string' + case ShrimpFieldTypes.Number: return typeof v === 'number' && !Number.isNaN(v) + case ShrimpFieldTypes.Boolean: return typeof v === 'boolean' + case ShrimpFieldTypes.Date: return typeof v === 'number' || v instanceof Date || !isNaN(Date.parse(v)) + default: return true // 非内置标量类型(relation/json/自定义等)不在此校验 + } + } + const typeTargets = field.multiple && Array.isArray(value) ? value : [value] + for (const v of typeTargets) { + if (!checkType(v)) return { t: 'shrimp.fieldTypeError', params: { field: field.label } } } if (field.rules) {