如何为含模板化动态字段的TypeScript接口实现Zod Schema?
问题描述
我定义了如下TypeScript接口:
export interface SomeData { data: string [step_: `step_${string}`]: string [retry_: `retry_${string}`]: string [count_: `count_${string}`]: string }
想要实现对应的Zod Schema,但直接模仿接口的写法无法通过TypeScript校验:
export const SomeDataSchema = z.object({ data: z.string(), [step_: `step_${string}`]: z.string(), [retry_: `retry_${string}`]: z.string(), [count_: `count_${string}`]: z.string() })
示例请求负载如下:
{ "data": "some data", "step_1": "some data", "step_2": "some data", "count_1": "some data" }
需要实现支持模板化字段名的Zod Schema。
解决方案
Zod不支持直接在z.object()中使用模板字符串索引签名,但可以通过固定字段+正则匹配动态字段的组合方式实现需求,具体步骤如下:
- 定义固定字段的Schema
import { z } from "zod"; const fixedFields = z.object({ data: z.string() });
- 定义匹配模板化动态字段的Schema
使用z.record()结合正则表达式,精准匹配step_*、retry_*、count_*格式的字段:
const dynamicFields = z.record( z.string().regex(/^(step_|retry_|count_)\w+$/), z.string() );
如果需要更严格的约束(比如后缀只能是数字),可以把正则调整为:
const dynamicFields = z.record( z.string().regex(/^(step_|retry_|count_)\d+$/), z.string() );
- 合并Schema并对齐TypeScript类型
通过.and()方法将固定字段和动态字段的Schema合并,同时确保生成的类型与原接口SomeData一致:
export const SomeDataSchema = fixedFields.and(dynamicFields); // 可选:手动绑定类型,确保与原接口完全匹配 export type SomeData = z.infer<typeof SomeDataSchema>;
该方案既可以校验固定的data字段,也能验证所有符合前缀模板的动态字段,同时TypeScript类型也能和原接口保持对齐。
内容的提问来源于stack exchange,提问作者TouchA
相关产品推荐
相关产品推荐

