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:

typescriptfunction 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:

typescriptinterface ILength {
  length: number;
}

Successivamente, nella nostra funzione, definiamo un tipo generico che estende ILength tramite la parola chiave extends:

typescriptfunction myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

Ecco come appare il nostro codice completo:

typescriptinterface 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:

typescriptconsole.log(myFunc('abcde'));

Risultato del codice eseguito:

typescript5
'abcde'

Ora passiamo un array come parametro:

typescriptconsole.log(myFunc(['a', 'b', 'c']));

Risultato del codice eseguito:

typescript3
[ 'a', 'b', 'c' ]