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
- 01
status: 'success'Un discriminante literal identifica este miembro sin ambigüedad.
- 02
if (result.status === 'success')El análisis de flujo conoce ahora todas las demás propiedades de la variante elegida.
Lo que obtienes
Result<number>['status']
→"success" | "failure"Extract<Result<number>, { status: 'success' }>
→{ status: "success"; data: number; }ReturnType<typeof unwrap<string>>
→string
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.
