Saltar al contenido
Modelar estados que se estrechan

    ↑↓ mover · ⏎ abrir · esc cerrar

    Patrones

    ¿Cómo hago que los datos de éxito solo estén disponibles en la rama de éxito y los errores en la de fallo?

    Da a cada variante un campo literal compartido. Comprobarlo estrecha el objeto entero, no solo el campo.

    La receta

    type Result<T> =
      | { status: 'success'; data: T }
      | { status: 'failure'; error: Error }
    
    function unwrap<T>(result: Result<T>): T {
      if (result.status === 'success') {
        return result.data
      }
      throw result.error
    }

    La compilación compila esto y comprueba cada resultado de abajo.

    Cómo funciona

    1. 01
      status: 'success'

      Un discriminante literal identifica este miembro sin ambigüedad.

    2. 02
      if (result.status === 'success')

      El análisis de flujo conoce ahora todas las demás propiedades de la variante elegida.

    Lo que obtienes

    Dónde falla

    Los campos opcionales en un objeto amplio no crean la misma correlación. `status: "success" | "failure"` junto a `data` y `error` opcionales sigue permitiendo combinaciones imposibles.

    Conclusión

    Usa una unión de estados completos, no un objeto lleno de fragmentos opcionales.

    Véase también

    Patrones