Мы используем это для проверки данных, которые содержат компонент 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