I'll explore three patterns that make errors explicit, type-safe, and composable:
Discriminated unions as return types: encoding success and failure directly in the type system so the compiler enforces handling.
The safeAwait pattern: taming async code without nested try/catch blocks.
The Errore pattern: Go-style error handling for TypeScript with full type narrowing and compile-time safety.
No monads, no wrapper libraries, no functional programming required. Just practical patterns you can adopt incrementally.