Compile-Time vs Runtime Implications of Invalid Values
📝 Context
TypeScript protects you at compile-time, but runtime is a different story. APIs may send unexpected values that break your app.
🚨 Without TypeScript – The Problem
function PaymentStatus({ status }) { if (status === "paid") return <p>Payment Successful</p>; if (status === "failed") return <p>Payment Failed</p>; // ❌ Forgot to handle "pending" return <p>Unknown Payment Status</p>; } // API sends "pending" <PaymentStatus status="pending" />; // UI incorrectly shows "Unknown Payment Status"
✅ With TypeScript + never – Catch at Compile Time
type PaymentStatusType = "paid" | "failed" | "pending"; function PaymentStatus({ status }: { status: PaymentStatusType }) { switch (status) { case "paid": return <p>Payment Successful</p>; case "failed": return <p>Payment Failed</p>; case "pending": return <p>Payment is still processing...</p>; default: { const _exhaustive: never = status; return _exhaustive; } } }
🎯 Takeaway
- Compile-time: TypeScript forces you to cover "pending".
- Runtime: Even if API sends "delayed", validation guards + never pattern prevent silent failures.
Top comments (0)