Saltar al contenido
webtype.orgConditional types

    ↑↓ mover · ⏎ abrir · esc cerrar

    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'>
      true
    • IsString<string | number>
      boolean

      Distribuyó: `true` para `string`, `false` para `number`, unidos de vuelta en `boolean`. Sorprendente hasta que lo sabes, obvio después.

    • NoDistribute<string | number>
      false

      El 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.