Oltre le basi di TypeScript
TypeScript offre molto più della semplice tipizzazione. Vediamo alcuni pattern avanzati che uso quotidianamente nei miei progetti backend.
Branded Types
I branded types permettono di creare tipi nominali in TypeScript, evitando errori di confusione tra valori strutturalmente identici.
typescript
1type UserId = string & { readonly brand: unique symbol };2type OrderId = string & { readonly brand: unique symbol };34function getUserById(id: UserId) { /* ... */ }5function getOrderById(id: OrderId) { /* ... */ }67// Errore! Non puoi passare un OrderId dove serve un UserId8getUserById(orderId);Result Pattern
Invece di lanciare eccezioni, ritorna risultati espliciti:
typescript
1type Result<T, E> = 2 | { success: true; data: T }3 | { success: false; error: E };45function parseUser(json: string): Result<User, ParseError> {6 try {7 return { success: true, data: JSON.parse(json) };8 } catch {9 return { success: false, error: new ParseError() };10 }11}Dependency Injection con TypeScript
Usa i types per definire contratti chiari:
typescript
1interface UserRepository {2 findById(id: UserId): Promise<User | null>;3 save(user: User): Promise<void>;4}56class UserService {7 constructor(private readonly repo: UserRepository) {}8 9 async getUser(id: UserId) {10 return this.repo.findById(id);11 }12}Conclusione
Questi pattern non sono solo "eleganti" - prevengono bug reali e rendono il codice più manutenibile. Inizia ad applicarli gradualmente nei tuoi progetti.
#backend#javascript#performance#best-practices
Condividi questo articolo: