Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida Typescript - Tipi generici e funzioni

Guida Typescript

Capitolo 10° - Tipi generici e funzioni

<< Precedente Prossimo >>

Come l'overloading dei parametri stringa, i tipi generici permettono a Typescript di catturare il comportamento di molte librerie Javascript. Questa funzionalità è la più importante di tutte quando si tratta di identificare i dettagli di un'API.

Per illustrare, prendiamo il tipo 'Array' che è predefinito nel linguaggio Javascript. All'interno di 'lib.d.ts' possiamo vedere il seguente codice:

interface Array { 
 reverse(): T[]; 
 sort(compareFn?: (a: T, b: T) => number): T[]; 
 // ... 
} 

Queste definizioni possono avere uno o più parametri di tipo. Nel caso di 'Array' l'interfaccia ha un singolo parametro 'T' che definisce il tipo di elemento dell'array. Il metodo 'reverse' ritorna un array dello stesso tipo. Il metodo 'sort' accetta un parametro opzionale (nota il punto di domanda '?') che prende due parametri di tipo 'T' e ritorna un numero. 'sort' ritorna un arrray di elementi di tipo 'T'.

Anche le funzioni possono avere dei parametri generici. Ad esempio 'Array' contiene un metodo 'map', definito come seguente:

map<S>(func: (value: T, index: number, array: T[]) => S, thisArg?: any): S[]; 

Ok, un bel po' di codice! Vediamo cosa significa.

Il metodo 'map' ritorna un Array di 'S' e prende come argomento due parametri: una funzione che ritorna un elemento S dato un valore T, un indice e una lista di elementi T e un argomento opzionale di qualsiasi 'any' tipo. 

Map è una funzione che ritorna un nuovo array dopo aver chiamato una funzione su ogni singolo elemento dell'array.

Il compilatore Typescript può spesso dedurre i parametri di un metodo, evitando che il programmatore debba fornirli esplicitamente. Nel seguente esempio il compilatore decuce che 'S' è un tipo 'string', siccome la funzione che viene passata a 'map' ritorna una stringa.

function numberToString(a: number[]) { 
 var stringArray = a.map(v => v.toString()); 
 return stringArray; 
} 

In Typescript anche le classi possono avere dei parametri di tipo. Il seguente codice dichiara una classe che implementa una lista combinata di oggetti di tipo 'T'. E' anche possibile definire delle restrizioni sul parametro generico in maniera che esso estenda un un tipo più specifico. Vediamo un esempio:

interface NamedItem { 
 name: string; 
} 
class List<T extends NamedItem>  { 
 next: List<T> = null; 
 constructor(public item: T) { 
 } 
 insertAfter(item: T) { 
   var temp = this.next; 
   this.next = new List(item); 
   this.next.next = temp; 
 } 
 log() { 
   console.log(this.item.name); 
 } 
 // ... 
} 

console.log conosce che tipo.item è un istanza che estende NamedItem, quindi può chiamare .name.

<< Precedente Prossimo >>
A proposito dell'autore

E' un appassionato di programmazione con un particolare interesse per le tecnologie web e mobile. Da 11 anni gestisce il sito pierotofy.it e lavora negli Stati Uniti come consulente informatico tramite la sua azienda, MasseranoLabs LLC. Seguilo su Twitter: @pierotofy