Solución comentada
Publicado el 30 de julio de 2026La solución
type MyReturnType<T> = T extends (...args: never[]) => infer R ? R : never
El error más común
type MyReturnType<T> = T extends () => infer R ? R : never
Un patrón sin parámetros solo encaja con funciones sin parámetros, así que `(a: number) => boolean` cae en `never`. El patrón debe ser permisivo con los parámetros para serlo con las firmas.
Línea por línea
(...args: never[]) => infer RComo los parámetros son contravariantes, una lista de parámetros `never[]` es asignable *desde* cualquier otra. Es la forma segura de escribir «una función de cualquier forma» sin recurrir a `any`.
infer R`infer` en posición de retorno pide al compilador que resuelva lo que haya ahí. Es el mismo mecanismo que inferir el tipo de elemento de un array — solo cambia la posición.
Para recordar
`infer` puede ir en cualquier sitio donde quepa un tipo dentro de un patrón. Casi todos los helpers de extracción de la librería estándar son un condicional con un `infer` bien colocado.