如何在Zod泛型约束中强制传入Schema继承基础Schema?
如何在TypeScript中强制Zod Schema继承基础Schema
要实现你需要的编译时约束,只需通过TypeScript泛型约束结合Zod的类型工具,限制baseClass的泛型参数必须兼容你的基础Schema。
实现方案
修改baseClass的泛型定义,约束TSchema必须是能解析出包含基础Schema结构的值的Zod类型:
import { ZodType, z } from "zod"; const baseSchema = z.object({ baseString: z.string() }); // 提取基础Schema解析后的值类型 type BaseValue = z.infer<typeof baseSchema>; const validChildSchema = baseSchema.extend({ childString: z.string() }); const invalidChildSchema = z.object({ childString: z.string() }); // 约束TSchema必须是ZodType,且其解析输出必须包含BaseValue的所有字段 class baseClass<TSchema extends ZodType<BaseValue>> {} class childClassValid extends baseClass<typeof validChildSchema> {} // ✅ 正常编译 // ❌ 编译报错:invalidChildSchema的输出不包含baseString字段,不符合约束 class childClassInvalid extends baseClass<typeof invalidChildSchema> {}
细节说明
- 这里的约束基于Schema的输出值类型,这是Zod最核心的校验目标——确保最终解析出的值符合基础结构要求。
- 如果需要更严格的约束(比如强制Schema必须是通过
baseSchema.extend()生成的,而非手动构造的兼容结构),可以依赖Zod内部的类型标记,但这种方式受限于Zod的版本实现,不如基于输出类型的约束通用可靠。
内容的提问来源于stack exchange,提问作者Damien Sawyer
相关产品推荐
相关产品推荐

