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

如何为含模板化动态字段的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()中使用模板字符串索引签名,但可以通过固定字段+正则匹配动态字段的组合方式实现需求,具体步骤如下:

  1. 定义固定字段的Schema
import { z } from "zod";

const fixedFields = z.object({
  data: z.string()
});
  1. 定义匹配模板化动态字段的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()
);
  1. 合并Schema并对齐TypeScript类型
    通过.and()方法将固定字段和动态字段的Schema合并,同时确保生成的类型与原接口SomeData一致:
export const SomeDataSchema = fixedFields.and(dynamicFields);

// 可选:手动绑定类型,确保与原接口完全匹配
export type SomeData = z.infer<typeof SomeDataSchema>;

该方案既可以校验固定的data字段,也能验证所有符合前缀模板的动态字段,同时TypeScript类型也能和原接口保持对齐。

内容的提问来源于stack exchange,提问作者TouchA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:25:00