typescript - Hur använder man en parameter som typdefinition?
Är det möjligt att dynamiskt definiera en parametertyp baserat på en annan parameter?
Som i följande scenario:
import z from 'zod'
// I have a function that defines a command factory with a build function
const defineCommand = (name:string, schema: z.ZodTypeAny) => {
return {
schema,
build: (payload: z.infer<typeof schema>) => {
return {
payload
}
}
}
}
const CreatePostCommand = defineCommand('CreatePostCommand', z.object({
title: z.string().min(2),
body: z.string().min(2)
}));
// now when I call the build function there is no type check for the payload
const commandInstance = CreatePostCommand.build({foo: "bar"}) // <<-- this should cause type error
Jag vet att det fungerar med generics men på det här sättet skulle jag behöva skicka in "schemat" två gånger. En gång som typ och en gång som schemaobjekt.
Svar #1
Med generiska typer finns det inget behov av att skicka det två gånger. Kolla in det:
const defineCommand = <T extends z.ZodType>(name:string, schema: T) => {
return {
schema,
build: (payload: z.infer<T>) => {
return {
payload
}
}
}
}
