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ó:
trueparastring,falseparanumber, unidos de vuelta enboolean. 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 6.0.3, no se escribió a mano.
Lo que no hace
- No comprueba igualdad.
T extends stringtambié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.

