Skip to content

TypeScript代码片段

# 对象数据校验的封装

灵感来源:Element-Plus 当时感觉这个东西在前端校验代码时挺好用的,可以减少很大一部分的代码冗余 自己来后端也试着封装了一个

主要代码部分
typescript
/*
 * @Author: 芝士雪豹
 * @Date: 2023-12-05 10:55:50
 * @LastEditors: your name
 * @LastEditTime: 2023-12-20 21:06:35
 * @Description: 
 * @FilePath: /robot-server-ts/src/uitls/verifyRules.ts
 */
import { Rule } from "../interface/rules";

function objectIsEmpty(obj: any): boolean {
    for (const key in obj) {
        if (!obj[key]) return true;
    }
    return false;
}

function getValues(obj: any, keys: string) {
    return obj[keys];
}


/**
 * 用户信息校验
 * @param data 要校验的数据
 * @param rules 校验规则
 * @returns 是否满足规则
 */
function userRules<T>(obj: T|null, rules: Rule[],custom?:Function): boolean {
    let isPass: boolean = true;
    for (let index = 0; index < rules.length; index++) {
        const item = rules[index];
          // 获取规则对应的属性名
          const data = getValues(obj, item.name);
          if (!data && item.require) {
            return false
          };
          // 非空验证
          if (item.require && !data && data!=undefined) {
            return isPass = false;
          };
          // 校验最大长度
          if (item.maxLength && data.length > item.maxLength && data!=undefined) return isPass = false;

          // 校验最小长度
          if (item.minLength && data.length < item.minLength && data!=undefined) return isPass = false;

          // 特殊字符正则
          const specialCharReg = /^[\u4e00-\u9fa5A-Za-z0-9_-]+[\))(,;\(\.\%。\u4e00-\u9fa5A-Za-z0-9_-]?$/;

          // 校验是否包含特殊字符
          if (item.noSpecialChar && !specialCharReg.test(data) && data!=undefined ) return isPass = false;

          // 匹配中文字符的正则表达式
          const chineseReg = /[\u4e00-\u9fa5]/g;
          if (item.noChinese && chineseReg.test(data) && data!=undefined) return isPass = false;

          // 手机号校验
          const telReg = /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1589]))\d{8}$/

          if(item.isTel && !telReg.test(data) && data!=undefined){
            console.log('手机号校验');
            return isPass = false;
          }

          // 邮箱校验
          const emailReg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
          if(item.isEmail && !emailReg.test(data) && data!=undefined){
            console.log('邮箱校验');
            return isPass = false;
          }
    }
    if(custom) {
      const customRetrun = custom(obj);
      if(customRetrun == false) return isPass =false;
    }
    return isPass;
}

export default userRules;
Rule类型
typescript
/*
 * @Author: 芝士雪豹
 * @Date: 2023-12-05 18:26:07
 * @LastEditors: your name
 * @LastEditTime: 2023-12-20 21:04:15
 * @Description:
 * @FilePath: /robot-server-ts/src/interface/rules.ts
 */
/**
 * @description: 校验规则
 */
export interface Rule {
    /**
     * 字段名称
     */
    name:string,
    /**
     * 是否不能为空
     */
    require:boolean,
    /**
     * 最大长度
     */
    maxLength?:number,
    /**
     * 最小长度
     */
    minLength?:number,
    /**
     * 不包含特殊字符
     */
    noSpecialChar?:boolean,
    /**
     * 不包含中文
     */
    noChinese?:boolean,
    /**
     * 手机号
     */
    isTel?:boolean;

    /**
     * 邮箱
     */
    isEmail?:boolean;
}
基础使用方法
typescript
   const command: RobotCommand = context.request.body as RobotCommand;
    const vertify = userRules<RobotCommand>(command, [
        { name: 'name', require: true },
        { name: 'selKey', require: true },
        { name: 'type', require: true },
        { name: 'command', require: true }
    ])
    if (!vertify) return fail<string>(context, '操作失败!', '数据缺失');
自定义校验

使用custom 方法进行自定义校验

typescript
  const user:UserRegister = context.request.body as UserRegister
    // 数据校验
    const vertify:boolean = userRules<UserRegister>(user, userRegisterRules,(obj:UserRegister)=>{
        if(!obj.email && !obj.phone) return false
    })
    if(!vertify) return  fail<null>(context,'注册失败',null);
最近更新