You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Zod创建含default键的Record类型?现有方案验证异常

解决Zod创建含固定属性的任意键值对象类型问题

你需要的是必须包含default字符串属性,同时所有额外键值对也都是字符串类型的对象,之前用z.union的方式错误,因为union是“或”逻辑,只要满足其中一个schema就会通过验证,导致不含default的对象也能被z.record通过。

正确实现方式

使用z.object()配合z.and()(或z.intersection())实现“且”逻辑,确保对象同时满足两个条件:

  1. 必须存在default属性且类型为字符串
  2. 所有键值对的类型都是字符串
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栩恒

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:52:39