Skip to content
webtype.orgwebtype.org

    ↑↓ move · ⏎ open · esc close

    No. 221 · July 29, 2026 · Moderate

    Return Type

    Implement MyReturnType<T> so it extracts what a function type returns, whatever parameters it takes. Anything that is not a function returns never.

    01

    Try the puzzle yourself

    Par 3

    Puzzle

    return-type.ts
    Stroke 1 of 3Not run yet

    Replace ??? — your solution is checked against the cases below. Tab indents; press Escape then Tab to move focus out.

    Checks

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

    How a check is judged Exact type equality, not assignability — an intersection is not the same as the flattened object.

    How everyone did

    Fewer than 5 people have solved this one so far. The distribution appears once there is enough of a sample to mean anything.

    Short game

    Fewest characters

    No public scores yet.

    Archive
    02

    Annotated solution

    Published July 30, 2026

    The solution

    type MyReturnType<T> = T extends (...args: never[]) => infer R ? R : never

    The common wrong answer

    type MyReturnType<T> = T extends () => infer R ? R : never

    A zero-parameter pattern only matches zero-parameter functions, so (a: number) => boolean falls through to never. The pattern must be permissive about parameters to be permissive about signatures.

    Line by line

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

      Because parameters are contravariant, a parameter list of never[] is assignable *from* every other parameter list. It is the safe way to write "a function of any shape" without reaching for any.

    2. infer R

      infer in return position asks the compiler to solve for whatever sits there. It is the same mechanism as inferring an element type from an array — only the position changes.

    Takeaway

    infer can be placed anywhere a type can appear inside a pattern. Most of the standard library’s extraction helpers are one conditional with one infer in the right spot.

    Uses