Un solo campo
Valida un campo cuando el usuario sale del input, sin mandar todo el formulario.
No siempre quieres esperar al submit. A veces, cuando la persona sale del input (onBlur), ya quieres saber si ese nombre se ve real.
UserSemantic.node("fullName") te da un handle solo para ese campo. Usa las mismas reglas y el mismo contexto que el objeto entero, pero recortado a ese path.
Ejemplo en onBlur
const FullName = UserSemantic.node("fullName"); async function onBlur(value: string) { const controller = new AbortController(); const result = await FullName.safeParse(value, { signal: controller.signal, }); return result;}El handle se memoriza. Llamar node("fullName") muchas veces te devuelve el mismo objeto.
Cancela la petición anterior
Si la persona sigue escribiendo, cancela el AbortController de antes. Si no, puedes recibir la respuesta vieja después de la nueva.
let controller = new AbortController(); async function onChange(value: string) { controller.abort(); controller = new AbortController(); try { return await FullName.safeParse(value, { signal: controller.signal }); } catch (error) { if (error instanceof EDcheckAbortError) { return null; } throw error; }}EDcheck no cancela solo las peticiones viejas. Tú tienes que pasar el signal. Y un servidor compartido no debe abortar el trabajo de otra request.
¿Y las reglas de varios campos?
Una regla crossField solo corre en un node si todos sus paths están debajo de ese nodo. Si la regla mira age y occupation, validar solo age no la dispara.
Mira node.ruleIds para saber qué reglas cubre ese campo. El resto déjalo para el submit del objeto entero.
FullName.ruleIds;// por ejemplo: ["fullName"]