README
@oishi/joi
simple Joi。做了一点微小的工作,修改了 @type/joi 的描述文件,重新包装了 Joi 的调用方式,typescript 不香么?
简单介绍一下
Joi,这是一个可以在运行时帮助做参数验证非常好的一个库但是说到参数验证,
typescript不行么,的确可以,但是typescript是编译时校验,且如果参数写的都是any... 就等着收刀片吧程序编译后,在运行时无法校验参数,这时候使用
Joi就可以解决这个问题
这里附上 Joi 的相关资源 Joi Gitub,Joi doc,有需要可以自查
介绍
既然有了 Joi,为什么我还要包裹一层,多此一举?私以为,在实际使用过程中,对于验证后的参数没有智能提示,返回的 result 是个 any 类型,这就非常不 ts,所以就做了一些改动,包装了调用方式,并增加了两个可以获取确切值类型的 ts 类型推论方法,具体可以参见 使用 环节
安装
npm install @oishi/joi
# or
yarn add @oishi/joi
特性
- 使用
Joi验证值后,result可以返回正确的类型 - 曝露
SchemaType和ValidateType方法,方便获取值类型
使用
简单参数验证
这里旨在介绍日常简单的使用方式
import Joi, { OishiJoi } from '@oishi/joi';
const oishi = new OishiJoi();
const schema = Joi.object({
name: Joi.string(),
age: Joi.string(),
detail: Joi.object({ job: Joi.string() }),
});
const validator = oishi.createSchema(schema);
const allow = { name: 'king', age: '18', detail: { job: 'developer' } };
const notAllow = { name: 'king', age: 18, detail: { job: 'developer' } };
// 若使用 typescript,这里就可以得到 result 的类型提示
const result = validator.validate(allow);
// 即:在输入 result. 后,可以得到智能提示
console.log(result.name);
console.log(result.detail);
// 多层级也不在话下
console.log(result.detail.job);
(async () => {
const asyncResult = await validator.validateAsync(allow);
})();
// 报错,验证不通过,Throw new Error
const result2 = validator.validate(notAllow);
获取正确类型
在平时开发时,声明 schema 之后,往往还需要声明 interface,这里提供两个 helper 函数,用于获取 schema 或者 validator 的接口类型
import Joi, { OishiJoi, SchemaType, ValidateType } from '@oishi/joi';
const oishi = new OishiJoi();
const schema = Joi.object({
name: Joi.string(),
age: Joi.string(),
detail: Joi.object({ job: Joi.string() }),
});
const validator = oishi.createSchema(schema);
type RealShemaType = SchemaType<typeof schema>;
type RealValidateType = ValidateType<typeof validator>;
let schemaItem: RealShemaType;
// 可以获取到 ts 的智能提示
// schemaItem.detail.job
// 可以获取到 ts 的智能提示
let validateItem: RealValidateType;
// validateItemschemaItem.detail.job
友好错误处理
若不传入 handleError,则会在验证出错时直接将错误信息抛出,若想捕获错误只能通过 try catch
若传入 handleError,则可以在验证错误时进行错误处理,比如上报信息或其他
另外,在 new OishiJoi() 的时候可以传入 handler 做统一处理,在 createSchema 时也可以传入 handler,做单独的 schema 错误处理
import Joi, { OishiJoi } from '@oishi/joi';
const oishi = new OishiJoi({
handleError: (errors) => console.error(errors),
});
const schema = Joi.object({
name: Joi.string(),
age: Joi.string(),
detail: Joi.object({ job: Joi.string() }),
});
const validator = oishi.createSchema(schema, {
handleError: (errors) => {
// 一些特殊的处理
},
});
const schema2 = Joi.object({
type: Joi.string(),
});
const validator2 = oishi.createSchema(schema2);
API
const oishi = new OishiJoi();
oishi.createSchema
oishi.createSchema(schema: Joi.Schema, options?: {handleError:(error) => void})
schema: Joi.Schema 的类型,可以通过 Joi.object() 或者 Joi.number() 等生成
options: {handleError:(error) => void}
validator.validate
validator.validate(value:any, options?:Joi.ValidationOptions)
value: any
options: Joi.ValidationOptions
validator.validateAsync
validator.validateAsync(value:any, options?:Joi.AsyncValidationOptions)
value: any
options: Joi.AsyncValidationOptions
example
TODO,一些使用例子
TODO
- 使用
.required()或者.optional()后,能更加智能推导返回值类型