Búsqueda de sitios web

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
            }
        }
    }
}