Zod对象keyof()返回类型未正确推导,TypeScript类型报错问题
解决Zod对象生成枚举时的TypeScript类型错误
问题分析
你遇到的类型错误根源在于访问了Zod对象的内部私有属性_type。这个属性属于Zod的内部实现细节,它的类型定义没有和泛型T的键信息做正确关联,导致调用其keyof()方法时,TypeScript推断出的类型是ZodEnum<never>,和你定义的SchemaEnum<T>(即ReturnType<T["keyof"]>)不兼容。
解决方案
直接调用传入的Zod对象本身公开的keyof()方法即可,无需依赖内部的_type属性。Zod的AnyZodObject类型已经原生提供了这个方法,返回的正是我们需要的Zod枚举类型。
修正后的代码
import { z } from "zod"; const FormSchema = z.object({ username: z.string().trim().min(1).max(20), password: z.string().trim().min(12).max(100), rememberMe: z.coerce.boolean().optional().default(false), redirectTo: z.string().trim().startsWith("/"), }); type Schema<T extends z.AnyZodObject> = z.infer<T>; type SchemaEnum<T extends z.AnyZodObject> = ReturnType<T["keyof"]>; function getEnumFromSchema<T extends z.AnyZodObject>(schema: T): SchemaEnum<T> { // 直接调用schema公开的keyof方法,避免依赖内部实现 return schema.keyof(); } function test() { const t = getEnumFromSchema(FormSchema); // hover查看t的类型:z.ZodEnum<["username", "password", "rememberMe", "redirectTo"]>,无类型错误 }
关键细节说明
- Zod的
_type字段是未公开的内部实现,其类型定义没有绑定到泛型T的具体键集合,所以调用它的keyof()会得到错误的never类型枚举。 - 直接使用
schema.keyof()时,由于schema是泛型T的实例,T["keyof"]的返回类型会自动关联到当前Zod对象的键集合,类型完全匹配,不会触发类型错误。
内容的提问来源于stack exchange,提问作者Benedikt
相关产品推荐
相关产品推荐

