在前端有效地验证嵌套 JSON schema/config

Efficiently validate nested JSON schema/config on front end

我在 typescript 项目中有以下 JSON 配置。我想在 运行 时间内在前端验证这一点。我正在寻找类似于 node-convict 的解决方案。

我需要验证

  1. 唯一 id / 没有重复的 ID。
  2. 唯一名称。
  3. 必填属性非空type
  4. 有条件地输入多个子项,例如如果类型 === folder 他们 应该有 children 道具。它可以是一个空数组。
  5. 多层嵌套对象。

我找到了 AJV。 AJV 文档仅指整个对象是唯一的,而不是特定的属性。我可能会提出自己的想法并进行一些递归验证。但是,我正在寻找最有效的解决方案,无论是使用 ajv、另一个库还是我可以用来验证这一点的有效数据结构。

如果使用外部库,则需要与打字稿兼容。我不是在寻找打字稿编译时验证。

[{
    "type": "folder",
    "name": "",
    "id": 1, // UUID
    "chldren": [{
            "id": 11, // UUID
            "type": "table", // TABLE TYPE
            "name": "Some Table 1",
            "meta": {},
            "dataSource": "..........."
        },
        {
            "type": "folder", // FOLDER TYPE
            "name": "",
            "id": 111, // UUID
            "chldren": [{
                "type": "folder",
                "name": "",
                "id": 1111, // UUID
                "chldren": [{
                    "id": 11111, // UUID
                    "type": "table",
                    "name": "Some Another Table",
                    "meta": {},
                    "dataSource": "..........."
                }]
            }]
        }
    ]
}]

我建议从版本 16 开始使用 Joi data validation library. It has had browser support

例子如下e.g.

import Joi from '@hapi/joi';

const schema = Joi.object({
    type: Joi.string()
        .alphanum()
        .required(),

    id: Joi.number()
        .integer()

    // I've not defined the whole schema for your object...
})     

然后您可以使用以下方法验证您的对象:

schema.validate({ type: 'folder', id: 1 });
// -> { error: null, value: { type: 'folder', id: 1 }}

或者:

try {
    const value = await schema.validateAsync({ type: 'folder', id: 1 });
}
catch (err) { }

您可以从 here 获取 Joi 的 TypeScript 类型。

可以找到此工作的示例 here