返回

构建自己的 schema 类库

前端

在上一篇文章《构建大型 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 类库。希望它能对你有帮助。