Tengo un campo en mi JSON que se supone que contiene los valores permitidos para una entrada desplegable.
[ { "field": "status", "type": "select", "defaultValue": "open", "allowedValues": ["open", "pending", "closed"] }, ... ]Este campo debe contener una matriz de cadenas o un nombre de token (por ejemplo, $valorespermitidos$) del cual mi código debe extraer la lista de valores permitidos.
Mi problema es que me gustaría usar Ajv para validar el JSON, pero aparentemente el tipo de cadena y matriz no se pueden usar juntos.
enum InputType { SIMPLE = "simple", SELECT = "select", AUTOCOMPLETE = "autocomplete", } interface DefaultDefinition { ... type: InputType; allowedValues: string | string[]; } const defaultDefinitionSchema: JSONSchemaType<DefaultDefinition> = { type: "object", properties: { ... type: { type: "string", enum: [InputType.AUTOCOMPLETE, InputType.SELECT, InputType.SIMPLE], }, allowedValues: { type: ["array", "string"], items: { type: "string" }, } }, required: ["allowedValues"], additionalProperties: false, };Mensaje de error
Los tipos de propiedad 'tipo' son incompatibles. El tipo '("cadena" | "matriz")[]' no se puede asignar al tipo '"matriz"'.
Como solución alternativa, he considerado agregar otra propiedad llamada allowValuesToken de tipo cadena y hacer de allowValues una matriz de cadenas.
El problema con este enfoque es que se debe requerir una de esas propiedades, pero nunca ambas.
Me preguntaba si puedo especificar esto a través de si/entonces, pero ya tengo una condición si/entonces (no pude probarla todavía, debido a mi problema con el tipo de valores permitidos) y parece que como tengo que definir el lista absoluta de campos obligatorios en then/else (al contrario de agregar/eliminar dinámicamente campos individuales), esta tampoco es una forma realmente factible.
if: { properties: { type: { enum: [InputType.SIMPLE], }, }, }, then: { required: ["type"] }, else: { required: ["type","allowedValues"] },¿Alguien puede decirme cuál es la forma correcta de lograr mi requisito?