Zod - установка ограничений длины для объединенных массивов в объекте

Я использую Zod для разработки этих схем. У меня есть объект с двумя полями, каждое из которых представляет собой массив. Я хочу установить ограничение, чтобы общая длина этих двух массивов не превышала трех. Есть идеи, как к этому подойти? Код ниже.

      export const personality = z.object({
   enumInput: personalityEnum.array(),
   customInput: z.string().length(20).array()
})

export type Personality = z.infer<typeof personality>

1 ответ

Немного поздний ответ здесь, но я думаю, вы можете сделать это, используя Refine :

      import { z } from "zod";
enum PersonalityType {
  Grumpy = "grumpy",
  Sleepy = "sleepy",
  Bashful = "bashful"
}
const personalityEnum = z.enum([
  PersonalityType.Grumpy,
  PersonalityType.Sleepy,
  PersonalityType.Bashful
]);
export const personality = z
  .object({
    enumInput: personalityEnum.array(),
    customInput: z.string().length(20).array()
  })
  .refine(
    (input) => {
      return input.customInput.length + input.enumInput.length <= 3;
    },
    {
      message:
        "The combined length of enumInput and customInput may not be longer than 3"
    }
  );

export type Personality = z.infer<typeof personality>;

const test1 = personality.safeParse({
  enumInput: [
    PersonalityType.Sleepy,
    PersonalityType.Grumpy,
    PersonalityType.Bashful
  ],
  customInput: ["Sneezy but length 20"]
});
// This fails with the custom error message
const test2 = personality.safeParse({
  enumInput: [PersonalityType.Sleepy],
  customInput: ["Sneezy but length 20"]
});
// This succeeds!

В сторону

Я заметил, работая над этим, что .length(20)уточнение означает, что длина пользовательского ввода должна составлять ровно 20 символов. Это то, что вы намеревались? Если бы вы искали строку длиной не более 20 символов, я думаю max(20)это то, что вы хотите.

Другие вопросы по тегам