Estoy usando ajv con TypeScript y tengo un tipo personalizado MyCustomType . Al crear un esquema de validación, quiero asegurarme de que una propiedad específica sea del tipo MyCustomType . Entonces, ajv debería validar su estructura y decidir si esto podría analizarse para el tipo dado.
Comencé con el siguiente código de muestra (y creé un ejemplo de Codesandbox para fines de prueba)
import { AType } from "./AType"; // custom type import { AnInterface } from "./AnInterface"; // custom interface import Ajv from "ajv"; type MyComplexType = AType | AnInterface; // create a more complex type from the given imports const ajvInstance = new Ajv(); const schema = { type: "object", properties: { myComplexType: { type: "string" } // value structure must match structure of MyComplexType }, required: ["myComplexType"], additionalProperties: false }; const validate = ajvInstance.compile(schema); const data = { myComplexType: {} }; const isValid = validate(data); if (isValid) { console.info("everything is fine"); } else { validate.errors?.forEach((error) => console.error(error.message)); } Actualmente no sé cómo crear un esquema de validación para la propiedad myComplexType . Encontré algunas discusiones.
pero no creo que esto ayude porque
typeof solo devuelve "object"instanceof no funcionará para los tipos Entonces, ¿tengo que crear una palabra clave personalizada (como se describe aquí ) y escribir mi propia lógica de validación (inspeccionar la estructura del objeto) o hay algo que ya pueda usar? ¿Cómo debo configurar myComplexType ?
No creo que pueda crear un type personalizado con esta biblioteca, tal vez esté confundiendo los tipos de JavaScript con los tipos de TypeScript . Entonces, probablemente tenga 2 opciones: 1) en lugar de usar tipos, use clases y use instanceof para validar una instancia de su clase, por ejemplo
class MyClass {} const instanceofDef = require("ajv-keywords/dist/definitions/instanceof") instanceofDef.CONSTRUCTORS.MyClass = MyClass ajv.validate({instanceof: "MyClass"}, new MyClass())o 2) creas un esquema anidado como este
const schema = { type: "object", properties: { myComplexType: { type: "object", properties: { myProperty: { type: "string" }, myFunction: { type: "function" }, ... } } }, required: ["myComplexType"], additionalProperties: false }; const validate = ajvInstance.compile(schema); const data = { myComplexType: { myProperty: "Hello World", myFunction: function(){} } }; const isValid = validate(data);