Back to notes
#TypeScript#Programming#Tips

Essential TypeScript Tips

Useful TypeScript patterns and techniques for writing better code

Essential TypeScript Tips

TypeScript is a powerful tool for building scalable applications. Here are some essential tips to level up your TypeScript game.

Utility Types

TypeScript provides several built-in utility types that can help you manipulate types more effectively:

Partial<T>

Makes all properties optional:
interface User { id: number; name: string; email: string; } type PartialUser = Partial<User>; // All properties are optional

Pick<T, K>

Selects a subset of properties:
type UserPreview = Pick<User, 'id' | 'name'>;

Omit<T, K>

Excludes specific properties:
type UserWithoutId = Omit<User, 'id'>;

Discriminated Unions

Use discriminated unions for type-safe handling of different data types:
type Result = | { status: 'success'; data: string } | { status: 'error'; error: Error } | { status: 'loading' }; function handleResult(result: Result) { if (result.status === 'success') { console.log(result.data); // data is available here } else if (result.status === 'error') { console.log(result.error); // error is available here } }

Const Assertions

Use
as const
to get the most specific literal types:
const colors = ['red', 'green', 'blue'] as const; // Type is readonly ['red', 'green', 'blue'] const config = { apiUrl: 'https://api.example.com', timeout: 5000 } as const; // Types are inferred as readonly literals

Generics with Constraints

Add constraints to make generics more powerful:
interface HasLength { length: number; } function getLength<T extends HasLength>(item: T): number { return item.length; } getLength('hello'); // OK getLength([1, 2, 3]); // OK getLength(42); // Error!

Key Takeaways

  • Use utility types to reduce boilerplate
  • Leverage discriminated unions for type safety
  • Use const assertions for literal types
  • Apply generic constraints for better type checking
Happy coding! 🚀