Saltar al contenido
webtype.orgwebtype.org#212 rebuild-pick · par 2

    ↑↓ mover · ⏎ abrir · esc cerrar

    N.º 212 · 20 de julio de 2026 · Suave

    Reconstruye Pick

    Implementa `MyPick<T, K>` para que conserve solo las claves nombradas en `K`. Es el `Pick` incorporado, escrito a mano — un tipo mapeado, sin condicionales.

    01

    Intenta el puzle tú mismo

    Par 2

    Puzle

    rebuild-pick.ts
    interface Todo {
      title: string
      description: string
      done: boolean
    }
    Intento 1 de 2Aú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
    • MyPick<Todo, 'title'>
      { title: string }
    • MyPick<Todo, 'title' | 'done'>
      { title: string; done: boolean }
    • MyPick<Todo, 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.

    Juego corto

    Menos caracteres

    Aún no hay marcas públicas.

    Archivo
    02

    Solución comentada

    Publicado el 21 de julio de 2026

    La solución

    type MyPick<T, K extends keyof T> = { [P in K]: T[P] }

    El error más común

    type MyPick<T, K extends keyof T> = { [P in keyof T]: T[P] }

    Mapear sobre `keyof T` copia el objeto entero — `K` nunca se consulta. La cláusula tras `in` es el conjunto de claves que construyes, no del que lees.

    Línea por línea

    1. { [P in K]: ... }

      `K` es una unión de claves literales. Un tipo mapeado se distribuye sobre esa unión y produce una propiedad por miembro.

    2. T[P]

      Un acceso indexado. Como `K extends keyof T`, `P` siempre es una clave real de `T`, así que esto nunca se ensancha a `unknown`.

    Para recordar

    Un tipo mapeado se lee `{ [Nombre in ConjuntoDeClaves]: TipoValor }`. Todo lo demás en esta ruta es una variación de esa forma.

    Usa