如何修改Zod Schema适配多格式布尔值与指定规则字符串校验
Zod Schema 适配需求解决方案
1. 扩展布尔类型支持多种格式
用 z.preprocess 先做值转换,把输入的字符串映射为标准布尔值,再交给 z.boolean() 校验:
import { z } from "zod"; const flexibleBoolean = z.preprocess((val) => { if (typeof val === "string") { const lowerVal = val.toLowerCase(); if (lowerVal === "t" || lowerVal === "yes") return true; if (lowerVal === "f" || lowerVal === "no") return false; } // 不符合规则的值会进入后续校验抛出错误 return val; }, z.boolean()); // 测试示例 flexibleBoolean.parse("T"); // 返回 true flexibleBoolean.parse("No"); // 返回 false flexibleBoolean.parse("invalid"); // 抛出 ZodError
这段逻辑会先将输入字符串转小写,匹配允许的取值后转换为对应布尔值,非预期值会被布尔校验器拦截报错。
2. 固定长度的大写字母+数字字符串校验
通过 z.string().regex() 配合正则表达式实现,规则限定必须是大写字母(A-Z)或数字(0-9),且长度固定:
// 以长度6为例,把 {6} 替换为你需要的固定长度即可 const fixedLengthAlnum = z.string().regex(/^[A-Z0-9]{6}$/, { message: "必须是6位大写字母或数字的组合", }); // 测试示例 fixedLengthAlnum.parse("ABC123"); // 校验通过 fixedLengthAlnum.parse("ABc123"); // 报错(包含小写字母) fixedLengthAlnum.parse("ABC12"); // 报错(长度不足6) fixedLengthAlnum.parse("ABC1234"); // 报错(长度超过6)
正则 ^[A-Z0-9]{N}$ 中的 N 替换为目标固定长度,同时可自定义报错信息提升可读性。
内容的提问来源于stack exchange,提问作者Tad
相关产品推荐
相关产品推荐

