面试题答案
一键面试- 定义验证规则类型:
type ValidationRule<T> = { regex: RegExp; message: string; validate: (value: unknown) => value is T; };
- 创建验证器模块:
const validators: Record<string, ValidationRule<any>> = {}; export const addValidator = <T>(name: string, rule: ValidationRule<T>) => { validators[name] = rule; }; export const validate = <T>(name: string, value: unknown): value is T => { const rule = validators[name]; if (!rule) { throw new Error(`Validator '${name}' not found`); } return rule.validate(value); };
- 添加具体验证规则示例:
- 日期格式验证:
const dateRegex = /^\d{4}-(0[1 - 9]|1[0 - 2])-(0[1 - 9]|[12][0 - 9]|3[01])$/; const dateValidate = (value: unknown): value is string => { return typeof value ==='string' && dateRegex.test(value); }; addValidator('date', { regex: dateRegex, message: 'Invalid date format. Expected YYYY - MM - DD', validate: dateValidate });
- 手机号码格式验证:
const phoneRegex = /^1\d{10}$/; const phoneValidate = (value: unknown): value is string => { return typeof value ==='string' && phoneRegex.test(value); }; addValidator('phone', { regex: phoneRegex, message: 'Invalid phone number format. Expected 11 - digit number starting with 1', validate: phoneValidate });
- 日期格式验证:
- 使用验证器:
const testDate = '2023 - 10 - 05'; if (validate('date', testDate)) { console.log('Date is valid'); } else { console.log('Date is invalid'); } const testPhone = '12345678901'; if (validate('phone', testPhone)) { console.log('Phone number is valid'); } else { console.log('Phone number is invalid'); }
以上代码通过定义验证规则类型,创建可复用的验证器模块,实现了可以方便添加新验证规则,并在调用验证函数时保证参数类型正确的功能。addValidator
方法用于添加新的验证规则,validate
方法用于执行验证。通过类型断言和类型守卫确保类型安全。