Solución comentada
Publicado el 3 de agosto de 2026La solución
type Trim<S extends string> = S extends `${Whitespace}${infer R}` ? Trim<R> : S extends `${infer R}${Whitespace}` ? Trim<R> : S
El error más común
type Trim<S extends string> = S extends `${Whitespace}${infer R}${Whitespace}` ? Trim<R> : S
Exigir espacios en ambos extremos en un solo patrón falla en cuanto solo uno los tiene: `" left"` no encaja, así que no se recorta nada. Los dos extremos deben tratarse por separado.
Línea por línea
`${Whitespace}${infer R}``Whitespace` es una unión, así que este patrón son en realidad tres patrones a la vez — un literal de plantilla encaja si cualquier miembro de la unión cabe en la ranura.
Trim<R>Cada pasada quita un carácter y el resultado se realimenta. Ambas ramas recurren al mismo tipo, así que el mismo bucle consume los espacios iniciales y finales.
Para recordar
Una unión dentro de un patrón de literal de plantilla multiplica los patrones que se prueban. Las ramas condicionales ordenadas te dejan luego pelar un extremo cada vez sin escribir dos tipos separados.