Solución comentada
Publicado el 26 de julio de 2026La solución
type Split<S extends string, D extends string> = S extends `${infer Head}${D}${infer Tail}` ? [Head, ...Split<Tail, D>] : [S]
El error más común
type Split<S extends string, D extends string> = S extends `${infer Head}${D}${infer Tail}` ? [Head, Split<Tail, D>] : [S]
Sin la expansión, cada resultado recursivo queda anidado un nivel más: `["a", ["b", ["c"]]]`. Los `...` son los que aplanan la recursión en una sola tupla.
Línea por línea
`${infer Head}${D}${infer Tail}`La inferencia contra un literal de plantilla es ávida desde la izquierda, así que `Head` liga el prefijo más corto que permita encajar el resto del patrón — dando el primer campo, no el último.
[Head, ...Split<Tail, D>]La expansión incorpora en línea la tupla recursiva, de modo que cada nivel aporta un elemento a un resultado plano.
: [S]No queda delimitador. Toda la cadena restante es la última pieza, envuelta en una tupla para que la expansión de arriba tenga algo que incorporar.
Para recordar
Los tipos de cadena recursivos se descomponen por la cabeza y se reconstruyen con expansiones. Olvidar la expansión es el error más común al construir listas a nivel de tipos.