typescript - Zod'da bir jenerik fonksiyon tarafından oluşturulan şemadan tür nasıl çıkarılır?
Çok basit bir şema üreten genel bir fonksiyonum var.
const LeafSchema = <T extends z.ZodTypeAny>(valueSchema: T) {
return z.object({ value: valueSchema })
}
Şimdi bu oluşturulan Şemanın tipini ReturnType kullanarak türetmek istiyorum, ama aynı zamanda bir generic kullanmam gerekiyor, aksi takdirde değer any olacaktır.
type Leaf<T extends z.ZodTypeAny> = z.infer<ReturnType<typeof LeafSchema<T>>>
const getLeafValue = <T extends z.ZodTypeAny>(leaf: Leaf<T>) => leaf.value
Ancak, hâlâ { 'value': 123 } ile getLeafValue çağırırken any alıyorum. Generics ile ilgili bir yanlışlık olduğunu anlıyorum, ama bunu nasıl düzelteceğimden emin değilim. Ne yazık ki zod ile generics hakkında çok bir şey bulamadım...
İşte Oyun Alanı
Cevap #1
<T extends ZodAnyType> ile <T> yerine ZodType<T> ile <T> kullanarak çalıştırmayı başardım. Neredeyse amaçlandığı gibi çalışıyor, çünkü getLeafValue fonksiyonunda sayı dışında undefined da dönecek.
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 }
Bu örnekte z.infer'i Required<> ile sarmak sorunu çözer, ancak mevcut olduğunda isteğe bağlı değeri de zorunlu hale getirir. Yani bu sadece çözümün yarısıdır...
Oyun alanı
Cevap #2
import { z } from 'zod'
const LeafSchema = <T extends z.ZodTypeAny>(valueSchema: T) => z.object({ value: valueSchema })
const LeafRefSchema = LeafSchema(z.string())
type LeafefSchemaInterface = z.infer<typeof LeafRefSchema>
