Branded types prevent mixing up values with the same underlying type. Here's how to use them effectively.
The Problem#
Basic Branded Types#
Creating Branded Values#
Branded Primitives#
With Zod Validation#
Opaque Types Pattern#
Branded Types with Classes#
Practical Patterns#
Type Guards#
Best Practices#
Design:
✓ Brand semantically different values
✓ Use factory functions with validation
✓ Export type and factory together
✓ Consider runtime validation
Naming:
✓ Use descriptive brand names
✓ Match domain terminology
✓ Be consistent across codebase
✓ Document branded types
Integration:
✓ Combine with Zod/validation
✓ Use with API boundaries
✓ Brand database IDs
✓ Brand user input after validation
Conclusion#
Branded types prevent mixing up structurally identical but semantically different values. Use them for IDs, currencies, validated data, and domain concepts. Combine with validation libraries like Zod for runtime safety. The small overhead pays off in bug prevention and self-documenting code.