Els genèrics són una característica poderosa de TypeScript que permet crear components reutilitzables que poden treballar amb diferents tipus de dades. Els genèrics proporcionen una manera de definir funcions, classes i interfícies que no estan lligades a un tipus específic, sinó que poden treballar amb qualsevol tipus que es passi com a argument.
Conceptes Clau
- Definició de Genèrics: Els genèrics es defineixen utilitzant paràmetres de tipus, que són variables de tipus que es poden utilitzar dins de la funció, classe o interfície.
- Paràmetres de Tipus: Els paràmetres de tipus es defineixen entre els símbols
<
i>
. - Reutilització de Codi: Els genèrics permeten escriure codi més flexible i reutilitzable.
Exemples Pràctics
Funcions Genèriques
Una funció genèrica és una funció que pot treballar amb diferents tipus de dades. Aquí teniu un exemple d'una funció genèrica que retorna el mateix valor que rep com a argument:
function identity<T>(arg: T): T { return arg; } // Ús de la funció genèrica amb diferents tipus let output1 = identity<string>("Hola, TypeScript!"); let output2 = identity<number>(42); console.log(output1); // Hola, TypeScript! console.log(output2); // 42
Classes Genèriques
Les classes genèriques permeten crear estructures de dades que poden treballar amb diferents tipus. Aquí teniu un exemple d'una classe genèrica que emmagatzema un valor:
class Box<T> { private content: T; constructor(content: T) { this.content = content; } getContent(): T { return this.content; } } // Ús de la classe genèrica amb diferents tipus let stringBox = new Box<string>("Hola, món!"); let numberBox = new Box<number>(123); console.log(stringBox.getContent()); // Hola, món! console.log(numberBox.getContent()); // 123
Interfícies Genèriques
Les interfícies genèriques permeten definir contractes que poden treballar amb diferents tipus. Aquí teniu un exemple d'una interfície genèrica:
interface Pair<T, U> { first: T; second: U; } let pair: Pair<string, number> = { first: "Hola", second: 42 }; console.log(pair.first); // Hola console.log(pair.second); // 42
Exercicis Pràctics
Exercici 1: Funció Genèrica
Crea una funció genèrica reverseArray
que prengui un array de qualsevol tipus i retorni un nou array amb els elements en ordre invers.
function reverseArray<T>(arr: T[]): T[] { return arr.reverse(); } // Prova la funció amb diferents tipus let reversedStringArray = reverseArray<string>(["a", "b", "c"]); let reversedNumberArray = reverseArray<number>([1, 2, 3]); console.log(reversedStringArray); // ["c", "b", "a"] console.log(reversedNumberArray); // [3, 2, 1]
Exercici 2: Classe Genèrica
Crea una classe genèrica Stack
que implementi una pila (stack) amb operacions per afegir (push
) i treure (pop
) elements.
class Stack<T> { private items: T[] = []; push(item: T): void { this.items.push(item); } pop(): T | undefined { return this.items.pop(); } peek(): T | undefined { return this.items[this.items.length - 1]; } isEmpty(): boolean { return this.items.length === 0; } } // Prova la classe amb diferents tipus let numberStack = new Stack<number>(); numberStack.push(1); numberStack.push(2); console.log(numberStack.pop()); // 2 console.log(numberStack.peek()); // 1 let stringStack = new Stack<string>(); stringStack.push("a"); stringStack.push("b"); console.log(stringStack.pop()); // "b" console.log(stringStack.peek()); // "a"
Errors Comuns i Consells
- Oblidar especificar el tipus: Quan es crida una funció genèrica o es crea una instància d'una classe genèrica, és important especificar el tipus. Si no es fa, TypeScript intentarà inferir el tipus, però això pot no ser sempre correcte.
- No utilitzar genèrics quan caldria: Els genèrics són molt útils per crear codi reutilitzable. Si trobes que estàs duplicant codi per treballar amb diferents tipus, considera utilitzar genèrics.
Conclusió
Els genèrics són una eina poderosa en TypeScript que permeten crear codi flexible i reutilitzable. Hem vist com utilitzar genèrics en funcions, classes i interfícies, i hem practicat amb alguns exercicis. Amb aquesta base, estàs preparat per explorar altres característiques avançades de TypeScript.
Curs de TypeScript
Mòdul 1: Introducció a TypeScript
- Què és TypeScript?
- Configuració de l'entorn de TypeScript
- Tipus bàsics
- Anotacions de tipus
- Compilació de TypeScript
Mòdul 2: Treballant amb Tipus
Mòdul 3: Tipus Avançats
Mòdul 4: Funcions i Mòduls
- Tipus de Funció
- Paràmetres Opcional i per Defecte
- Paràmetres Rest
- Mòduls i Espais de Noms
- Decoradors
Mòdul 5: Programació Asíncrona
Mòdul 6: Eines i Millors Pràctiques
- Linting i Formatació
- Proves de Codi TypeScript
- TypeScript amb Webpack
- TypeScript amb React
- Millors Pràctiques