typescript 如何从zod中的泛型函数生成的模式中推断类型?

pepwfjgg  于 2023-05-08  发布在  TypeScript
关注(0)|答案(1)|浏览(110)

我有一个通用函数,它生成了一个非常简单的模式。

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

icnyk63a

icnyk63a1#

我通过使用<T>ZodType<T>而不是<T extends ZodAnyType><T>来使它工作。几乎按预期工作,因为undefined将在getLeafValue函数中返回数字旁边。

type Leaf<T> = z.infer<ReturnType<typeof LeafSchema<z.ZodType<T>>>>
type NumberLeaf = Leaf<number>
//    ^? { value: number }

const getLeafValue = <T>(leaf: Leaf<T>) => leaf.value
const test = { 'value': 123 }
const val = getLeafValue(test)
//     ^? { value: number | undefined }

在这个例子中,用Required<> Package z.infer可以修复它,但也需要可选值(如果存在)。所以,只有一半的解决方案…
Playground

相关问题