AJV - 检查 属性 是一个函数

AJV - Check property is a function

我正在使用 AJV 检查 "settings" 对象。我想添加一个新的 属性 onFeedbackChange 可以是一个函数(不是必需的)。

  const ajv = new Ajv({
    allErrors: true,
  });
  ajv.addKeyword('function', {
    valid: true,
    validate: function (data) {
      return typeof data === 'function';
    }
  });
  const validate = ajv.compile(settingsSchema);

架构:

  feedback:
    type: object
    properties:
      enabled:
        type: boolean
      saveFeedback: *endpoint
      updateFeedback: *endpoint
      onFeedbackChange: function
    additionalProperties: false
    required:
    - enabled
    - saveFeedback
    - updateFeedback

但这失败了:

Error: schema is invalid: data.properties['modules'].properties['feedback'].properties['onFeedbackChange'] should be object,boolean

我想知道如何执行验证,以及为什么这不是内置的。

我们正在使用它来验证包含 React 组件的数据:

我们正在验证的数据:

const config = {
    id: 'dailyGraph',
    component: BarGraph, // <-- react component (function)
    type: 'bar',
    ...
}

我们的架构:

const barSchema = {
    $schema: 'http://json-schema.org/draft-07/schema',
    $id: 'dailyGraph',
    type: 'object',
    readOnly: true,
    title: 'Schema for validating graph config',
    properties: {
        id: { 
            $id: '#/properties/id',
            type: 'string'
        },
        component: {
            $id: '#/properties/component',
            instanceof: 'Function', // <-- ajv custom keyword
        },
        type: {
            $id: '#/properties/type',
            type: 'string',
            enum: ['bar','pie'],
        }
        ...
    },
    required: ['id', 'assays', 'graphType']
};

以及此处的 .addKeyword 语法:https://github.com/epoberezkin/ajv/issues/147#issuecomment-199371370

const ajv = new Ajv();
const { id } = config;
const CLASSES = { Function: Function, ... };

ajv.addKeyword('instanceof', {
  compile: schema => data => data instanceof CLASSES[schema]
});

ajv.validate(barSchema, config)
  ? res(true)
  : console.error(`Graph config error for ${id}: ${ajv.errorsText()}`);

component 作为字符串(或函数以外的任何内容)传递会抛出:Graph config error for dailyGraph: data.component should pass "instanceof" keyword validation