
5 Useful TypeScript Tips
A practical TypeScript checklist for safer props, cleaner APIs, and more maintainable app code.
1. Model State With Real Unions
The fastest way to make UI state safer is to stop representing everything as booleans and optional properties. A discriminated union gives every render path an explicit shape, so loading, success, and error states stop leaking into each other.
This matters most in dashboards, forms, and async widgets where a component can be half-loaded or half-broken. If the state machine is clear in the type system, the UI becomes easier to review and harder to break accidentally.
2. Type Inputs at the Boundary, Not Everywhere
When data enters your system, validate and type it once. After that, keep the rest of the code working with stable internal shapes instead of re-checking the same assumptions in every component.
This reduces noise and makes refactors cheaper. The deeper your app goes, the more value you get from a trusted internal contract.
3. Prefer Utility Types With Intent
Pick, Omit, Partial, and Record are useful, but they are not a substitute for naming a real domain concept. If a shape matters across multiple files, give it a proper type name instead of recreating it inline.
That one decision improves readability in code review and helps future contributors understand what the type represents, not just how it was assembled.
4. Let Inference Do the Simple Work
Annotate public interfaces, function boundaries, and shared utilities. Inside small local expressions, let inference carry the load. Over-typing obvious code creates friction without adding real safety.
The goal is not maximal annotation. The goal is a codebase where the important contracts are unmistakable.
5. Treat `any` as a Temporary Escape Hatch
Sometimes you have to move quickly around messy third-party data or unfinished migrations. When that happens, use `any` narrowly, document why, and keep the unsafe region close to the boundary.
Unchecked `any` spreads fast. If you do not contain it immediately, it eventually erases the value of TypeScript in the very files where you needed it most.
const greet = (name: string): string => { return `Hello, ${name}!`;};