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:
function 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:
interface ILength {
length: number;
}
Em seguida, em nossa função, definiremos um tipo genérico
que estende ILength
através da palavra-chave extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Este é o nosso código completo:
interface 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:
console.log(myFunc('abcde'));
Resultado do código executado:
5
'abcde'
E agora, vamos passar um array como parâmetro:
console.log(myFunc(['a', 'b', 'c']));
Resultado do código executado:
3
[ 'a', 'b', 'c' ]