Saltar al contenido
webtype.org#221 return-type · par 3

N.º 221 · 29 de julio de 2026 · Media

Tipo de retorno

Implementa `MyReturnType<T>` para que extraiga lo que devuelve un tipo función, sean cuales sean sus parámetros. Lo que no sea una función devuelve `never`.

01

Intenta el puzle tú mismo

Par 3

Puzle

return-type.ts
Intento 1 de 3Aún sin comprobar

Sustituye ??? — tu solución se comprueba con los casos de abajo. Tab indenta; pulsa Escape y luego Tab para sacar el foco.

Comprobaciones

4
  • MyReturnType<() => string>
    string
  • MyReturnType<(a: number) => boolean>
    boolean
  • MyReturnType<() => void>
    void
  • MyReturnType<string>
    never

Cómo se juzga una comprobación Igualdad exacta de tipos, no asignabilidad — una intersección no es lo mismo que el objeto aplanado.

Cómo le fue a todo el mundo

Menos de 5 personas han resuelto este puzle hasta ahora. La distribución aparece cuando la muestra sea lo bastante grande como para significar algo.

Archivo
02

Solución comentada

Publicado el 30 de julio de 2026

La 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

  1. (...args: never[]) => infer R

    Como 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`.

  2. 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.