TypeScript Professional
Strict TypeScript patterns for professional development.
Instructions
- Strict Mode Configuration
Always enable strict mode in tsconfig.json :
{ "compilerOptions": { "strict": true, "noImplicitAny": true, "strictNullChecks": true, "noUnusedLocals": true, "noUnusedParameters": true } }
- Naming Conventions
Type Convention Example
Interface PascalCase, prefix with I (optional) User , IUserService
Type PascalCase UserRole , ApiResponse
Enum PascalCase Status , Direction
Function camelCase getUserById , calculateTotal
Variable camelCase userName , isLoading
Constant UPPER_SNAKE_CASE MAX_RETRY_COUNT , API_URL
- Type vs Interface
// ✅ Interface for object shapes interface User { id: string; name: string; email: string; }
// ✅ Type for unions, intersections, primitives type Status = 'pending' | 'active' | 'inactive'; type ApiResponse<T> = { data: T; error: null } | { data: null; error: string };
- Never Use any
// ❌ Bad function process(data: any) { ... }
// ✅ Good - use unknown and narrow function process(data: unknown) { if (typeof data === 'string') { return data.toUpperCase(); } }
// ✅ Good - use generics function process<T>(data: T): T { ... }
- Utility Types
// Partial - all optional type PartialUser = Partial<User>;
// Required - all required type RequiredUser = Required<User>;
// Pick - select specific type UserName = Pick<User, 'name'>;
// Omit - exclude specific type UserWithoutId = Omit<User, 'id'>;
// Record - key-value mapping type UserMap = Record<string, User>;
- Function Types
// ✅ Explicit return types for public APIs function getUser(id: string): Promise<User | null> { // ... }
// ✅ Arrow function with types const add = (a: number, b: number): number => a + b;
- Generics
// ✅ Constrained generics function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; }
// ✅ Default generic types interface ApiResponse<T = unknown> { data: T; status: number; }
References
-
TypeScript Handbook
-
TypeScript Deep Dive