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)
это то, что вы хотите.