返回
构建自己的 schema 类库
前端
2023-10-17 12:34:06
在上一篇文章《构建大型 Mobx 应用的几个建议》中,我提到过使用 schema 来约定数据结构。但遗憾的事情是,在浏览器端,我一直没有能找到合适的 schmea 类库,所以只能用 Immutable.js 中的 Record 代替。
如果你还不了解什么是 schema,在这里我简单解释一下:schema 是一种用于数据结构的规范。它定义了数据类型、字段名、字段类型以及其他约束条件。有了 schema,我们可以更加轻松地进行类型检查和数据验证。
既然找不到合适的类库,那我就自己写一个吧。
首先,我们需要定义 schema 的语法。由于 JSON Schema 已经是一个非常成熟的标准了,所以我决定采用 JSON Schema 的语法。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Person",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"age": {
"type": "integer",
"minimum": 0
}
},
"required": ["name", "age"]
}
这是一个简单的 Person schema。它定义了 Person 对象的两个字段:name 和 age。name 字段是一个字符串类型,并且至少需要有一个字符。age 字段是一个整数类型,并且必须大于等于 0。
定义好 schema 的语法之后,我们就可以开始写类库了。
类库的核心是一个函数,这个函数可以将一个 schema 转换成一个 JavaScript 对象。这个对象可以用来验证数据是否符合 schema 的要求。
function createSchema(schema) {
// 校验 schema 是否符合 JSON Schema 的语法
// ...
// 将 schema 转换成 JavaScript 对象
const obj = {};
for (const key in schema.properties) {
const property = schema.properties[key];
obj[key] = {
type: property.type,
minLength: property.minLength,
minimum: property.minimum,
// ...
};
}
// 返回 JavaScript 对象
return obj;
}
有了这个函数,我们就可以在项目中使用 schema 来约定数据结构了。
const schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Person",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"age": {
"type": "integer",
"minimum": 0
}
},
"required": ["name", "age"]
};
const person = {
name: "John",
age: 20
};
const isValid = validate(schema, person);
if (isValid) {
// 数据符合 schema 的要求
} else {
// 数据不符合 schema 的要求
}
这样,我们就可以更加轻松地进行类型检查和数据验证了。
当然,这个类库还可以做更多的事情。比如,我们可以提供一个函数来生成一个符合 schema 的随机数据。
function generateData(schema) {
// 生成一个符合 schema 的随机数据
// ...
// 返回随机数据
return data;
}
有了这个函数,我们就可以在项目中使用 schema 来生成测试数据了。
const schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Person",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"age": {
"type": "integer",
"minimum": 0
}
},
"required": ["name", "age"]
};
const data = generateData(schema);
console.log(data);
这样,我们就可以更加轻松地生成测试数据了。
这就是我构建的 schema 类库。希望它能对你有帮助。