我尝试创建一个函数,它接受一个zod对象,并通过keyof()
函数返回一个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> {
const shape = schema._type;
return shape.keyof();
}
function test () {
const t = getEnumFromSchema(FormSchema);
}
将鼠标悬停在t
const t: z.ZodEnum<["username", "password", "rememberMe", "redirectTo"]>
上时,codesandbox上的highliter显示以下内容这将返回枚举,但TypeScript会引发错误Type 'ZodEnum<never>' is not assignable to type 'ReturnType<T["keyof"]>'.
我一直在试着向前看,但有些事情对我来说不对劲,我不知道我错在哪里。
1条答案
按热度按时间cnjp1d6j1#
我曾经尝试过ThePerplexedOne提供的一个答案,我发现如果我这样做,它会正确地推断。
因为在他们的例子中,你似乎不能将常量转换成联合体。这段代码正确地推断了类型键,也返回了一个枚举。