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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:24:30