Saltar al contenido
webtype.orgwebtype.org#213 unwrap-promise · par 3

    ↑↓ mover · ⏎ abrir · esc cerrar

    N.º 213 · 21 de julio de 2026 · Media

    Desenvuelve

    Implementa `Unwrap<T>` para que quite todas las capas de `Promise`, por muy anidadas que estén. Un tipo que no sea promesa pasa sin cambios.

    01

    Intenta el puzle tú mismo

    Par 3

    Puzle

    unwrap-promise.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
    • Unwrap<Promise<string>>
      string
    • Unwrap<Promise<Promise<number>>>
      number
    • Unwrap<boolean>
      boolean
    • Unwrap<Promise<Promise<Promise<null>>>>
      null

    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.

    Juego corto

    Menos caracteres

    Aún no hay marcas públicas.

    Archivo
    02

    Solución comentada

    Publicado el 22 de julio de 2026

    La solución

    type Unwrap<T> = T extends Promise<infer Inner> ? Unwrap<Inner> : T

    El error más común

    type Unwrap<T> = T extends Promise<infer Inner> ? Inner : T

    Esto quita exactamente una capa. `Promise<Promise<number>>` queda en `Promise<number>` y se detiene. La llamada recursiva es lo que lo hace total.

    Línea por línea

    1. T extends Promise<infer Inner>

      Empareja `T` con la forma `Promise<algo>` y vincula ese algo a `Inner`.

    2. ? Unwrap<Inner>

      Recursión. `Inner` puede ser a su vez una promesa, así que se repite la misma pregunta hasta que la respuesta sea no.

    3. : T

      El caso base. No es una promesa, así que `T` ya es el tipo del valor.

    Para recordar

    Un tipo condicional que se llama a sí mismo en la rama verdadera es el equivalente a un bucle `while` a nivel de tipos. La rama falsa es la salida.

    Usa