spinny:~/writing $ less advanced-typescript-patterns.md
12TypeScript a devenit standardul industrial pentru dezvoltarea web la scara larga. In timp ce majoritatea dezvoltatorilor cunosc bazele interfetelor si tipurilor, adevarata putere sta in sistemul avansat de tipuri. Iata 5 modele care te vor diferentia ca inginer senior.34## 1. Generic Constraints56Genericele sunt puternice, dar uneori trebuie sa limitezi ce poate fi transmis. `extends` este prietenul tau aici.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```1718Asigurand ca `T` extinde `HasId`, garantam ca accesarea `.id` in interiorul functiei este sigura.1920## 2. Conditional Types2122Tipurile conditionale iti permit sa creezi mapari de tipuri neuniforme. Sintaxa este similara cu operatorul ternar din JavaScript.2324```typescript25type IsString<T> = T extends string ? true : false;2627type A = IsString<string>; // true28type B = IsString<number>; // false29```3031Un caz practic de utilizare este filtrarea tipurilor dintr-o uniune:3233```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```3738## 3. Mapped Types3940Tipurile mapate iti permit sa creezi tipuri noi pe baza celor existente prin transformarea proprietatilor.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```5455Poti chiar adauga sau elimina modificatori:5657```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```6263## 4. Template Literal Types6465Introduse in TypeScript 4.1, acestea iti permit sa manipulezi tipuri de stringuri direct.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```7778Acest lucru este incredibil de util pentru tipizarea stringurilor care urmeaza un model specific, cum ar fi clasele CSS sau numele evenimentelor.7980## 5. Cuvantul cheie `infer`8182Cuvantul cheie `infer` din cadrul tipurilor conditionale iti permite sa extragi tipuri din alte tipuri.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```9394Aici, cerem TypeScript sa "deduca" tipul de return `R` al unei functii si sa il returneze.9596## Concluzie9798Stapanirea acestor modele iti permite sa scrii biblioteci si utilitare robuste care ofera o experienta excelenta pentru dezvoltatori (DX). Scopul TypeScript avansat nu este complexitatea de dragul complexitatii, ci siguranta si expresivitatea.99
:5 modele avansate TypeScript pentru ingineri seniorilines 1-99 (END) — press q to close