An ajv type provider based on json-schema-to-ts.
import Ajv from 'ajv';
import { enhanceCompileWithTypeInference } from '@toomuchdesign/ajv-type-provider-json-schema-to-ts';
const ajv = new Ajv();
const compile = enhanceCompileWithTypeInference(ajv.compile.bind(ajv));
const schema = {
type: 'object',
properties: {
foo: { type: 'integer' },
bar: { type: 'string' },
},
required: ['foo'],
additionalProperties: false,
} as const;
const validate = compile(schema);
let data: unknown = { foo: 6 };
if (validate(data)) {
// data type inferred from schema
console.log('Validation ok', data);
} else {
// validate is the usual AJV validate function
console.log('Validation ko', validate.errors);
}
npm i @toomuchdesign/ajv-type-provider-json-schema-to-ts
Enhance Ajv compile
method with type inference:
import Ajv from 'ajv';
import { enhanceCompileWithTypeInference } from '@toomuchdesign/ajv-type-provider-json-schema-to-ts';
const ajv = new Ajv();
const compile = enhanceCompileWithTypeInference(ajv.compile.bind(ajv));
Enhance Ajv validate
method with type inference:
import Ajv from 'ajv';
import { enhanceValidateWithTypeInference } from '@toomuchdesign/ajv-type-provider-json-schema-to-ts';
const ajv = new Ajv();
const validate = enhanceValidateWithTypeInference(ajv.validate.bind(ajv));
enhanceCompileWithTypeInference
and enhanceValidateWithTypeInference
accept a json-schema-to-ts FromSchema
option object to configure inferred types output:
const compile = enhanceCompileWithTypeInference<{ parseNotKeyword: true }>(
ajv.compile.bind(ajv),
);
const validate = enhanceValidateWithTypeInference<{ parseNotKeyword: true }>(
ajv.validate.bind(ajv),
);
references
option can be used to resolve $ref
schema types:
const userSchema = {
$id: 'http://example.com/schemas/user.json',
type: 'object',
properties: {
name: { type: 'string' },
age: { type: 'integer' },
},
required: ['name', 'age'],
additionalProperties: false,
} as const;
const usersSchema = {
type: 'array',
items: {
$ref: 'http://example.com/schemas/user.json',
},
} as const;
// Register ref schema in ajv
ajv.addSchema(userSchema);
const compile = enhanceCompileWithTypeInference<{
// Register ref schema type provider
references: [typeof userSchema];
}>(ajv.compile.bind(ajv));
const validate = compile(schema);
if (validate(data)) {
// Inferred data with resolved $ref schemas
const expectedData: { name: string; age: number }[] = data;
}
The current API is completely decoupled from Ajv
. This means enhancing Ajv
methods singularly, bypassing their original type implementation.
A different approach could consist of Ajv
exposing a hook to provide external type inference implementation, as done with Fastify's type providers:
import Ajv from 'ajv';
import type { JsonSchemaToTsProvider } from '@toomuchdesign/ajv-type-provider-json-schema-to-ts';
const ajv = new Ajv();
const typedAjv = ajv.withTypeProvider<JsonSchemaToTsProvider>();
Any contribution should be provided with a changesets
update:
npx changeset