Construcciones
Conditional types
El `if` a nivel de tipos. La pregunta que hace es siempre la asignabilidad.
Qué es
No igualdad, no instancia de — asignabilidad, en un solo sentido. Y cuando el tipo comprobado es un parámetro de tipo desnudo, el condicional distribuye: se ejecuta una vez por miembro de la unión y los resultados se vuelven a unir. Ese único comportamiento explica casi todo lo que parece magia en la biblioteca estándar, y casi todo lo que parece un error en tus propios tipos.
Ejemplos
IsString<'hello'>→trueIsString<string | number>
→booleanDistribuyó: `true` para `string`, `false` para `number`, unidos de vuelta en `boolean`. Sorprendente hasta que lo sabes, obvio después.
NoDistribute<string | number>
→falseEl envoltorio de tupla desactiva la distribución, y ahora la unión se juzga como un todo.
Cada tipo resuelto de arriba lo imprimió TypeScript 5.9.3, no se escribió a mano.
Lo que no hace
- No comprueba igualdad. `T extends string` también es cierto para cada literal de cadena, y preguntar «¿son el mismo tipo?» requiere el truco de identidad con dos condicionales, no esto.
- No distribuye cuando el tipo comprobado es algo distinto de un parámetro desnudo. Envolver cualquiera de los lados — en una tupla, un objeto, lo que sea — lo desactiva.
Conclusión
Cuando un condicional da una respuesta que no esperabas, pregunta primero si distribuyó. `[T] extends [U]` es el interruptor, y es el arreglo la mitad de las veces.