Búsqueda de sitios web

javascript - Esquema Zod: ¿Cómo hacer que un campo sea opcional O tenga una restricción mínima de cadena?


Tengo un campo donde quiero que el valor sea opcional O que el campo tenga una longitud mínima de 4.

He intentado lo siguiente:

export const SocialsSchema = z.object({
  myField: z.optional(z.string().min(4, "Please enter a valid value")),
});

Esto pasa si uso un valor como: "good", pero si tengo un valor vacío entonces falla.

¿Cómo implemento correctamente una restricción utilizando esquemas de zod para hacer un valor opcional con una restricción mínima si el valor no está vacío?

¿Es posible hacer esto sin usar expresiones regulares o la solución con expresiones regulares es la única manera?

Respuesta #1

Basado en este problema de Github y su respuesta

Usa la opción or combinada con opcional y literal, así.

export const SocialsSchema = z.object({
  myField: z
    .string()
    .min(4, "Please enter a valid value")
    .optional()
    .or(z.literal('')),
});

Respuesta #2

En su caso, considera que "" es lo mismo que undefined (es decir: cuando la cadena está vacía, es como si no hubiera cadena en absoluto).

Se puede implementar en Zod de esta manera:

import { z } from "zod";
import { strict as assert } from "node:assert";

// `myString` is a string that can be either optional (undefined or missing),
// empty, or min 4
const myString = z
  .union([z.string().length(0), z.string().min(4)])
  .optional()
  .transform(e => e === "" ? undefined : e);

const schema = z.object({ test: myString });

assert( schema.parse({}).test === undefined ); // missing string
assert( schema.parse({ test: undefined }).test === undefined ); // string is undefined
assert( schema.parse({ test: "" }).test === undefined ); // string is empty
assert( schema.parse({ test: "1234" }).test === "1234" ); // string is min 4

// these successfully fail
assert( schema.safeParse({ test: "123" }).success !== true );
assert( schema.safeParse({ test: 3.14 }).success !== true );

Artículos relacionados