Solución comentada
Publicado el 5 de agosto de 2026La solución
type Includes<T extends readonly unknown[], U> = T extends readonly [infer H, ...infer R] ? Equal<H, U> extends true ? true : Includes<R, U> : false
El error más común
type Includes<T extends readonly unknown[], U> = U extends T[number] ? true : false
Corto y equivocado. `T[number]` es la unión de tipos de elemento y `extends` pregunta por asignabilidad, así que `Includes<[boolean], true>` responde `true` — `true` es asignable a `boolean` aunque la tupla no contenga tal elemento. Asignabilidad no es pertenencia.
Línea por línea
Equal<H, U> extends true`Equal` devuelve el tipo `true` o el tipo `false`, así que hay que probarlo con `extends true` en lugar de usarlo directamente como condición. Este es el puzle donde el propio harness se convierte en herramienta.
: falseLlegar a la tupla vacía significa que se comprobaron todos los elementos y ninguno coincidió. Agotar la lista *es* la respuesta negativa.
Para recordar
Cuando un puzle dice «exactamente», `extends` es la herramienta equivocada — comprueba asignabilidad, que es unidireccional. La identidad exacta necesita `Equal`, y por eso toda comprobación de este sitio se apoya en él.