如何用Zod创建含default键的Record类型?现有方案验证异常
解决Zod创建含固定属性的任意键值对象类型问题
你需要的是必须包含default字符串属性,同时所有额外键值对也都是字符串类型的对象,之前用z.union的方式错误,因为union是“或”逻辑,只要满足其中一个schema就会通过验证,导致不含default的对象也能被z.record通过。
正确实现方式
使用z.object()配合z.and()(或z.intersection())实现“且”逻辑,确保对象同时满足两个条件:
- 必须存在
default属性且类型为字符串 - 所有键值对的类型都是字符串
import { z } from 'zod'; // 写法1:链式调用and const LocaleString = z.object({ default: z.string(), }).and(z.record(z.string())); // 写法2:使用intersection const LocaleString = z.intersection( z.object({ default: z.string() }), z.record(z.string()) );
验证测试
- 符合要求的对象:
LocaleString.safeParse({ default: 'en', zh: '中文' }); // 返回 { success: true, data: { default: 'en', zh: '中文' } } - 缺少
default的对象:LocaleString.safeParse({ testing: 'abc' }); // 返回 { success: false, error: [...] }(验证失败,符合预期) default类型错误的对象:LocaleString.safeParse({ default: 123, zh: '中文' }); // 返回 { success: false, error: [...] }- 额外属性类型错误的对象:
LocaleString.safeParse({ default: 'en', zh: 123 }); // 返回 { success: false, error: [...] }
原理说明
z.object({ default: z.string() })强制对象必须包含default字符串属性z.record(z.string())强制对象所有键对应的属性都是字符串类型and/intersection将两个schema合并为交集逻辑,只有同时满足两个条件的对象才能通过验证
内容的提问来源于stack exchange,提问作者XH栩恒
相关产品推荐
相关产品推荐

