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) {