Behavior When API Returns a Value Not in the Union Type
📝 Context
You define a strict union type like "admin" | "editor" | "viewer". But what if your API returns "super-admin"? Without TS, your UI may behave unpredictably.
🚨 Without TypeScript – The Problem
// React without TypeScript
function UserRoleMessage({ role }) {
switch (role) {
case "admin":
return <p>Welcome Admin</p>;
case "editor":
return <p>Welcome Editor</p>;
case "viewer":
return <p>Welcome Viewer</p>;
default:
return <p>Unknown Role</p>;
}
}
// API mistakenly sends "super-admin"
<UserRoleMessage role="super-admin" />;
// ❌ User just sees "Unknown Role"
👉 Issue
No warning at compile time. The bug slips through until runtime.
✅ With TypeScript + never – Safer API Handling
type UserRole = "admin" | "editor" | "viewer";
function UserRoleMessage({ role }: { role: UserRole }) {
switch (role) {
case "admin":
return <p>Welcome Admin</p>;
case "editor":
return <p>Welcome Editor</p>;
case "viewer":
return <p>Welcome Viewer</p>;
default: {
// Exhaustive check
const _exhaustive: never = role;
return _exhaustive;
}
}
}
// âś… Best practice: validate API before assignment
function validateRole(role: string): UserRole | null {
if (role === "admin" || role === "editor" || role === "viewer") {
return role;
}
return null;
}
const apiRole = "super-admin"; // From backend
const safeRole = validateRole(apiRole);
<UserRoleMessage role={safeRole ?? "viewer"} />;
🎯 Takeaway
- Without TS: Bad API values silently break UI.
- With TS: Union + never ensures exhaustiveness. Validation guards catch invalid values at runtime.
Top comments (0)