Tengo dos tipos de usuarios: teacher y student .
El esquema del maestro es:
{ username : string; firstName : string; lastName : string; type : 1; // 1 = teacher schoolId : objectId; email : string; }El esquema del estudiante es:
{ username : string; firstName : string; lastName : string; type : 2; // 2 = student classCode : number; } Para la validación, uso fastest-validator . Quiero construir un esquema para ello. Pero si ve, tenemos algunos campos diferentes en diferentes tipos de usuarios (el maestro tiene email y schoolId ; el estudiante tiene classCode ).
Mi deseo es construir un esquema como el siguiente pseudocódigo:
{ username : string, lastName : string, firstName: string, or: [ { type : 1, ... }, { type : 2, ... } ] }Utilice Json-Schema ya que sigue los estándares, es rápido y no tiene dependencias.
Puede ver a continuación ObjectTypeDef que ayuda a producir un esquema correcto.
Las funciones isTeacher , isStudent e isTeacherOrStudent escribirán su objeto como parámetro si la función devuelve true .
La propiedad anyOf es la mejor respuesta para usted: un esquema debe ser todo correcto, de lo contrario es falso. Las condiciones deben envolver todos los esquemas permitidos.
import type { JSONSchema7, JSONSchema7Definition } from 'json-schema'; import { validate } from 'json-schema'; type AnyObject<K extends string | number | symbol = string | number | symbol, T = any> = Record<K, T>; type ObjectTypeDef<T extends AnyObject> = JSONSchema7 & { properties: Record<keyof T, JSONSchema7Definition>; required: (keyof T)[]; }; type Teacher = { username: string; firstName: string; lastName: string; type: 1; schoolId: string; email: string; }; type Student = { username: string; firstName: string; lastName: string; type: 2; classCode: number; }; const schemaTeacher: ObjectTypeDef<Teacher> = { properties: { username: { type: 'string' }, firstName: { type: 'string' }, lastName: { type: 'string' }, type: { const: 1 }, schoolId: { type: 'string' }, email: { type: 'string' }, }, required: ['username', 'firstName', 'lastName', 'type', 'schoolId', 'email'], additionalProperties: false, }; const schemaStudent: ObjectTypeDef<Student> = { properties: { username: { type: 'string' }, firstName: { type: 'string' }, lastName: { type: 'string' }, type: { const: 2 }, classCode: { type: 'number' }, }, required: ['username', 'firstName', 'lastName', 'type', 'classCode'], additionalProperties: false, }; export const isTeacher = (obj: AnyObject): obj is Teacher => validate(obj, schemaTeacher).valid; export const isStudent = (obj: AnyObject): obj is Student => validate(obj, schemaStudent).valid; const schemaTeacherOrStudent: JSONSchema7 = { anyOf: [schemaStudent, schemaTeacher], }; export const isTeacherOrStudent = (obj: AnyObject): obj is Teacher | Student => validate(obj, schemaTeacherOrStudent).valid;