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 3Puzle
unwrap-promise.tstype Unwrap<T> = ???
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
4Có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 caracteresAún no hay marcas públicas.
Archivo02
Solución comentada
Publicado el 22 de julio de 2026La 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
T extends Promise<infer Inner>Empareja `T` con la forma `Promise<algo>` y vincula ese algo a `Inner`.
? 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.
: TEl 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.