自制填入信息校验机制(TypeScript)
Submit函数构建及错误信息提示
const onSubmit = (e: Event) => {
const rules: Rules<typeof formData> = [
{ key: 'name', type: 'required', message: '必填' },
{ key: 'name', type: 'pattern', regex: /^.{1,4}$/, message: '只能填 1 到 4 个字符' },
{ key: 'sign', type: 'required', message: '必填' },
]
Object.assign(errors, {
name: undefined,
sign: undefined
})
Object.assign(errors, validate(formData, rules))
e.preventDefault()
}
Submit内部validate()验证函数构建
interface FData {
[k: string]: string | number | null | undefined | FData
}
type Rule<T> = {
key: keyof T
message: string
} & (
{ type: 'required' } |
{ type: 'pattern', regex: RegExp }
)
type Rules<T> = Rule<T>[]
export type { Rules, Rule, FData }
export const validate = <T extends FData>(formData: T, rules: Rules<T>) => {
type Errors = {
[k in keyof T]?: string[]
}
const errors: Errors = {}
rules.map(rule => {
const { key, type, message } = rule
const value = formData[key]
switch (type) {
case 'required':
if (value === null || value === undefined || value === '') {
errors[key] = errors[key] ?? []
errors[key]?.push(message)
}
break;
case 'pattern':
if (value && !rule.regex.test(value.toString())) {
errors[key] = errors[key] ?? []
errors[key]?.push(message)
}
break;
default:
return
}
})
return errors
}
自制表单验证(TypeScript)
......