Saltar al contenido
webtype.orgwebtype.org

    ↑↓ 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 6.0.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.