为通用接口创建zod模式

lig*_*sky 7 runtime typescript zod

我有一个用于分页响应的通用接口:

export interface PaginatedResponse<T> {
  pageIndex: number;
  pageSize: number;
  totalCount: number;
  totalPages: number;
  items: Array<T>;
}
Run Code Online (Sandbox Code Playgroud)

然后我想将其转换为 zod 模式以进行运行时类型检查。方法是这样的:

const PaginatedResponseSchema = z.object({
  pageIndex: z.number(),
  pageSize: z.number(),
  totalCount: z.number(),
  totalPages: z.number(),
  items: z.array(???), // <=
});

export type PaginatedResponse<T> = z.infer<typeof PaginatedResponseSchema>;
Run Code Online (Sandbox Code Playgroud)

什么类型的数组应该是架构中的项目?

Sou*_*man 13

您可以创建一个通用函数,该函数在给定字段架构的情况下返回新架构items。例如你可以这样写:

function createPaginatedResponseSchema<ItemType extends z.ZodTypeAny>(
  itemSchema: ItemType,
) {
  return z.object({
    pageIndex: z.number(),
    pageSize: z.number(),
    totalCount: z.number(),
    totalPages: z.number(),
    items: z.array(itemSchema),
  });
}
Run Code Online (Sandbox Code Playgroud)

文档中的这一部分zod详细介绍了通用函数。