spinny:~/writing $ less advanced-typescript-patterns.md
12TypeScript è diventato lo standard industriale per lo sviluppo web su larga scala. Mentre la maggior parte degli sviluppatori conosce le basi delle interfacce e dei tipi, il vero potere risiede nel suo sistema di tipi avanzato. Ecco 5 pattern che ti distingueranno come senior engineer.34## 1. Generic Constraints56I generici sono potenti, ma a volte è necessario limitare ciò che può essere passato. `extends` è il tuo amico qui.78```typescript9interface HasId {10 id: string;11}1213function getById<T extends HasId>(list: T[], id: string): T | undefined {14 return list.find((item) => item.id === id);15}16```1718Assicurando che `T` estenda `HasId`, garantiamo che l'accesso a `.id` all'interno della funzione sia sicuro.1920## 2. Conditional Types2122I tipi condizionali permettono di creare mappature di tipi non uniformi. La sintassi è simile all'operatore ternario in JavaScript.2324```typescript25type IsString<T> = T extends string ? true : false;2627type A = IsString<string>; // true28type B = IsString<number>; // false29```3031Un caso d'uso pratico è filtrare i tipi da un'unione:3233```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```3738## 3. Mapped Types3940I tipi mappati permettono di creare nuovi tipi basati su quelli vecchi trasformando le proprietà.4142```typescript43type ReadOnly<T> = {44 readonly [P in keyof T]: T[P];45};4647interface User {48 name: string;49 age: number;50}5152type ReadOnlyUser = ReadOnly<User>;53```5455Puoi anche aggiungere o rimuovere modificatori:5657```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```6263## 4. Template Literal Types6465Introdotti in TypeScript 4.1, questi permettono di manipolare direttamente i tipi stringa.6667```typescript68type World = 'world';69type Greeting = `hello ${World}`; // "hello world"7071type Color = 'red' | 'blue';72type Quantity = 'light' | 'dark';7374type Palette = `${Quantity}-${Color}`;75// "light-red" | "light-blue" | "dark-red" | "dark-blue"76```7778Questo è incredibilmente utile per tipizzare stringhe che seguono un pattern specifico, come classi CSS o nomi di eventi.7980## 5. La Parola Chiave `infer`8182La parola chiave `infer` all'interno dei tipi condizionali permette di estrarre tipi da altri tipi.8384```typescript85type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;8687function check(): boolean {88 return true;89}9091type CheckReturn = ReturnType<typeof check>; // boolean92```9394Qui, stiamo chiedendo a TypeScript di "inferire" il tipo di ritorno `R` di una funzione e restituirlo.9596## Conclusione9798Padroneggiare questi pattern ti permette di scrivere librerie e utility robuste e che forniscono un'eccellente esperienza di sviluppo (DX). L'obiettivo di TypeScript avanzato non è la complessità per il gusto della complessità, ma la sicurezza e l'espressività.99
:5 Pattern TypeScript Avanzati per Software Engineer Seniorlines 1-99 (END) — press q to close