MST

星途 面试题库

面试题:TypeScript 正则表达式类型安全验证器的复杂规则封装

假设我们有多种复杂的验证规则,如验证日期格式(YYYY - MM - DD)、手机号码格式(1开头11位数字)等。请用TypeScript设计一个可复用的正则表达式类型安全验证器模块,要求可以方便地添加新的验证规则,并且在调用验证函数时能通过类型系统保证参数类型正确。
24.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 定义验证规则类型
    type ValidationRule<T> = {
        regex: RegExp;
        message: string;
        validate: (value: unknown) => value is T;
    };
    
  2. 创建验证器模块
    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);
    };
    
  3. 添加具体验证规则示例
    • 日期格式验证
      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
      });
      
  4. 使用验证器
    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 方法用于执行验证。通过类型断言和类型守卫确保类型安全。