Utilização de parâmetros de tipo em restrições de genéricos no TypeScript

O TypeScript também oferece a possibilidade de declarar um parâmetro de tipo que será restrito por outro parâmetro de tipo. Isso é necessário quando precisamos copiar propriedades de um objeto para outro, ao mesmo tempo em que nos protegemos contra a possibilidade de passarmos uma propriedade extra.

Vamos considerar o seguinte exemplo. Voltemos à função myFunc, que determina o comprimento de uma variável:

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

No entanto, agora queremos que esta função funcione apenas com tipos que possuam a propriedade length. Para isso, vamos criar a interface ILength, atribuindo a ela a propriedade length do tipo número:

typescriptinterface ILength {
  length: number;
}

Em seguida, em nossa função, definiremos um tipo genérico que estende ILength através da palavra-chave extends:

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

Este é o nosso código completo:

typescriptinterface ILength {
  length: number;
}

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

Vamos testar a nossa função e encontrar o comprimento da string:

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

Resultado do código executado:

typescript5
'abcde'

E agora, vamos passar um array como parâmetro:

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

Resultado do código executado:

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