TypeScript - ¿Cómo usar un parámetro como definición de tipo?
¿Es posible definir dinámicamente un tipo de parámetro basado en otro parámetro?
Como en el siguiente escenario:
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
Sé que funciona con genéricos, pero de esta manera tendría que pasar el "esquema" dos veces. Una como tipo y otra como objeto de esquema.
Respuesta #1
Con los genéricos, no es necesario pasarlo dos veces. Mira esto:
const defineCommand = <T extends z.ZodType>(name:string, schema: T) => {
return {
schema,
build: (payload: z.infer<T>) => {
return {
payload
}
}
}
}
