Utilizzo dei parametri di tipo nei vincoli dei generici in TypeScript
TypeScript offre anche la possibilità di dichiarare un parametro di tipo che sarà vincolato da un altro parametro di tipo. Questo è necessario quando si deve copiare le proprietà da un oggetto a un altro, assicurandosi al contempo di non passare proprietà non richieste.
Consideriamo il seguente esempio. Torniamo
alla funzione myFunc che determina
la lunghezza di una variabile:
function myFunc <T> (data: T): T {
console.log(data.length); // errore
return data;
}
Tuttavia, ora vogliamo che questa funzione
lavori solo con i tipi che possiedono
la proprietà length. Per fare ciò, creiamo
l'interfaccia ILength, a cui assegniamo
la proprietà length di tipo number:
interface ILength {
length: number;
}
Successivamente, nella nostra funzione, definiamo un tipo
generico che estende ILength
tramite la parola chiave extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Ecco come appare il nostro codice completo:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Verifichiamo il funzionamento della nostra funzione e troviamo la lunghezza di una stringa:
console.log(myFunc('abcde'));
Risultato del codice eseguito:
5
'abcde'
Ora passiamo un array come parametro:
console.log(myFunc(['a', 'b', 'c']));
Risultato del codice eseguito:
3
[ 'a', 'b', 'c' ]