Uso de parámetros de tipo en restricciones de genéricos en TypeScript
TypeScript también tiene la capacidad de declarar un parámetro de tipo que estará restringido por otro parámetro de tipo. Esto es necesario cuando se tienen que copiar propiedades de un objeto a otro, asegurándose al mismo tiempo de que no pasemos una propiedad extraña.
Veamos el siguiente ejemplo. Volvamos
a la función myFunc que determina
la longitud de una variable:
function myFunc <T> (data: T): T {
console.log(data.length); // error
return data;
}
Sin embargo, ahora queremos que esta función
funcione solo con aquellos tipos que
tengan la propiedad length. Para ello creemos la
interfaz ILength, a la que le asignaremos
la propiedad length de tipo numérico:
interface ILength {
length: number;
}
A continuación, en nuestra función definamos un tipo
genérico que herede de ILength
usando la palabra clave extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Así es como se ve nuestro código completo:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Comprobemos el funcionamiento de nuestra función y encontremos la longitud de una cadena:
console.log(myFunc('abcde'));
Resultado del código ejecutado:
5
'abcde'
Y ahora pasemos un array como parámetro:
console.log(myFunc(['a', 'b', 'c']));
Resultado del código ejecutado:
3
[ 'a', 'b', 'c' ]