Saltar al contenido
webtype.orgwebtype.org

    ↑↓ mover · ⏎ abrir · esc cerrar

    N.º 224 · 1 de agosto de 2026 · Difícil

    Une

    Implementa Join<T, D> para que concatene una tupla de cadenas con el delimitador D entre ellas. Sin delimitador antes del primero ni después del último.

    01

    Intenta el puzle tú mismo

    Par 4

    Puzle

    join-tuple.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

    4
    • Join<['a', 'b', 'c'], '-'>—
      → 'a-b-c'
    • Join<['solo'], '-'>—
      → 'solo'
    • Join<[], '-'>—
      → ''
    • Join<['x', 'y'], ''>—
      → 'xy'

    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 2 de agosto de 2026

    La solución

    type Join<T extends readonly string[], D extends string> =
      T extends readonly [infer F extends string, ...infer R extends string[]]
        ? R extends readonly []
          ? F
          : `${F}${D}${Join<R, D>}`
        : ''

    El error más común

    type Join<T extends readonly string[], D extends string> =
      T extends readonly [infer F extends string, ...infer R extends string[]]
        ? `${F}${D}${Join<R, D>}`
        : ''

    Cada nivel añade un delimitador, también el último, así que ["a","b","c"] da "a-b-c-". Unir no es «poner un separador tras cada elemento», sino «poner un separador *entre* elementos», y la diferencia solo se ve al final.

    Línea por línea

    1. infer F extends string

      La restricción extends string sobre un infer acota lo que se liga. Sin ella F sería unknown, que no puede interpolarse en un tipo de literal de plantilla.

    2. R extends readonly [] ? F

      La guarda que lo convierte en una unión y no en un sufijo. Cuando no sigue nada, el elemento se emite desnudo y la recursión termina sin aportar delimitador.

    Para recordar

    La construcción recursiva de cadenas casi siempre necesita un caso base distinto para el último elemento. Si tu salida acaba con un delimitador suelto, ese caso falta.

    Usa