Saltar al contenido
webtype.org#251 deep-partial · par 4

    ↑↓ mover · ⏎ abrir · esc cerrar

    N.º 251 · 3 de septiembre de 2026 · Difícil

    Opcional hasta el fondo

    Implementa `DeepPartial<T>` para que cada propiedad sea opcional en todos los niveles de anidamiento, no solo en el primero.

    01

    Intenta el puzle tú mismo

    Par 4

    Puzle

    deep-partial.ts
    Intento 1 de 4Aú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

    3
    • DeepPartial<{ a: { b: string } }>
      { a?: { b?: string } }
    • DeepPartial<{ x: number }>
      { x?: number }
    • DeepPartial<{ a: { b: { c: 1 } } }>
      { a?: { b?: { c?: 1 } } }

    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 4 de septiembre de 2026

    La solución

    type DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K] }

    El error más común

    type DeepPartial<T> = { [K in keyof T]?: T[K] }

    Eso es `Partial`, y se detiene en el primer nivel. `{ a: { b: string } }` se convierte en `{ a?: { b: string } }` — la clave externa es opcional y `b` sigue siendo tan obligatoria como antes. La profundidad no sale gratis; el tipo tiene que pedirla.

    Línea por línea

    1. T[K] extends object ? DeepPartial<T[K]> : T[K]

      La recursión vive en la cláusula de valor. Todo lo que tenga forma de objeto vuelve a pasar por `DeepPartial`; los primitivos se devuelven intactos, y eso es lo que termina el descenso.

    2. [K in keyof T]?:

      El `?` se aplica en todos los niveles porque cada nivel es una nueva llamada al mismo tipo mapeado. Una regla, escrita una vez, aplicada hasta el fondo.

    Para recordar

    Un tipo mapeado recursivo no es más que un tipo mapeado que se llama a sí mismo en la posición del valor. La condición que lo detiene — aquí, «¿sigue siendo un objeto?» — importa más que la recursión misma.

    Usa