最近在学`typescript`, 试着把<https://github.com/node-modules/parameter> 重构了,欢迎使用😁
发布于 3 年前 作者 chenkai0520 2042 次浏览 来自 分享

https://github.com/ckpack/parameter 例子:

import { Parameter } from '@ckpack/parameter';
const parameter = new Parameter();

const rule = {
  isAdmin: 'boolean',
  age: {
    type: 'int',
    min: 0,
    max: 200,
  },
  ids: {
    type: 'array',
    itemType: 'int',
    itemRule: {
      min: 1
    }
  }
}

const data = {
  isAdmin: true,
  age: 18,
  ids: [1, 2, 3]
};

const errors = parameter.validate(rule, data);

支持的验证类型

int

如果类型为int,则有以下选项规则

  • max - 值的最大值,值必须 <= max
  • min - 值的最小值,值必须 >= min
{
  score: 'int',
}
// or
{
  score: {
    type: 'int',
    min: 0,
    max: 200,
  }
}

number

如果类型为number,则有以下选项规则

  • max - 值的最大值,值必须 <= max
  • min - 值的最小值,值必须 >= min
{
  score: 'number',
}
// or
{
  score: {
    type: 'number',
    min: 0,
    max: 100,
  }
}

string

如果类型为string,则有以下选项规则

  • regex - 检查字符串格式的正则表达式
  • max - 字符串的最大长度
  • min - 字符串的最小长度
{
  username: 'string',
}
// or
{
  username: {
    type: 'string',
    regexp: /\S{4,20}/
  }
}

boolean

检查是否是boolean类型

{
  isAll: 'boolean',
}
// or
{
  isAll: {
    type: 'boolean',
  }
}

array

如果类型是数组,则有以下选项规则

  • itemType - 此数组中每个项目的类型
  • itemRule - 此规则中每个项目的规则
  • itemChecker- 每个项目的检查器,在这种情况下,您可以省略 itemTypeitemRule
  • max - 数组的最大长度
  • min - 数组的最小长度
{
  ids: {
    itemType: 'int',
    itemRule: {
      min: 1,
      max: 1000,
    },
    min: 0,
    max: 100,
  }
}

enum

如果类型是enum,则有以下规则

  • enum - 数组,其中的值必须为其中一个
{
  sex: ['man', 'woman']
}
// or
{
  sex: {
    type: 'enum'
    enum: ['man', 'woman']
  }
}

object

如果类型是对象,则有以下规则 rule - 验证对象属性的对象

{
  people: {
    type: 'object',
    rule: {
      name: 'string',
      age: {
        isRequired: false,
        type: 'int',
        min: 1,
        max: 200
      }
    }
  }
}

custom

你也可以定义自定义验证类型

import { Parameter } from '@ckpack/parameter';
const parameter = new Parameter();
// 验证是否为偶数
parameter.addRule('even', (rule, value) => {
  return value % 2 === 0 ? null : `${value} is not even`;
});

// rule
{
  someNumber: 'even'
}
// or
{
  someNumber: {
    type: "even",
  }
}

对于自定义验证类型你也可以添加参数如:

import { Parameter } from '@ckpack/parameter';
const parameter = new Parameter();

// 验证能否被某个数字整除
parameter.addRule('times', (rule, value) => {
  const { times } = rule;
  return value % times === 0 ? null : `not an integer multiple of ${times}`;
});

// rule
{
  someNumber: {
    type: "times",
    times: 3,
  }
}
2 回复

写 Node.js 库我都鲜少用 ts 了,不太好排查, 像 next 这样的话比较难搞 image.png

@xiaoxiaojx 我也不喜欢typescript, 感觉像是脱裤子放屁,影响效率,注意力全放在怎么解决报错信息上面了

回到顶部