我有一个通用函数,它生成了一个非常简单的模式。
const LeafSchema = <T extends z.ZodTypeAny>(valueSchema: T) {
return z.object({ value: valueSchema })
}
现在我想推断这个生成的Schema的类型,使用ReturnType,但我还必须使用泛型,如果不是,则值将是any
。
type Leaf<T extends z.ZodTypeAny> = z.infer<ReturnType<typeof LeafSchema<T>>>
const getLeafValue = <T extends z.ZodTypeAny>(leaf: Leaf<T>) => leaf.value
但是,当我用{ 'value': 123 }
调用getLeafValue时,仍然会得到any
。我知道我的泛型有问题,但我不知道如何修复它。很遗憾我没有找到很多关于zod的泛型的东西。
这里是Playground
1条答案
按热度按时间icnyk63a1#
我通过使用
<T>
和ZodType<T>
而不是<T extends ZodAnyType>
和<T>
来使它工作。几乎按预期工作,因为undefined将在getLeafValue
函数中返回数字旁边。在这个例子中,用
Required<>
Packagez.infer
可以修复它,但也需要可选值(如果存在)。所以,只有一半的解决方案…Playground