TypeScript non è JavaScript con tipi appiccicati sopra. È un modo diverso di pensare al codice. Dopo anni di progetti TS, ecco i pattern che usiamo quotidianamente.
Lascia che TypeScript inferisca
Non serve annotare tutto. const x = 5 è già tipato come number. Annotate quando l'inferenza non basta o quando volete documentare un'intenzione.
Le funzioni sono l'eccezione: annotate sempre i parametri. Il return type può essere inferito.
Union types > booleani
Invece di isLoading: boolean, hasError: boolean, usate uno stato unificato: status: 'idle' | 'loading' | 'success' | 'error'. Impossibile avere stati invalidi. TypeScript vi protegge.
Generics per riusabilità
Un componente Table che funziona con qualsiasi tipo di dato? Generics. Una funzione fetch che restituisce il tipo corretto? Generics. Il pattern è ovunque una volta che lo vedete.
Strict mode sempre
Attivate "strict": true in tsconfig.json. È più verboso inizialmente, ma previene intere categorie di bug. Il trade-off vale sempre la pena.
Types vs Interfaces
Per oggetti semplici, sono intercambiabili. Usate interface per API pubbliche (estensibili), type per union e tipi complessi. La coerenza nel progetto conta più della scelta specifica.