Używanie typowych parametrów w ograniczeniach generyków w TypeScript
W TypeScript istnieje również możliwość deklarowania jednego parametru typowego, który będzie ograniczony przez inny parametr typowy. Jest to konieczne, gdy musimy kopiować właściwości z jednego obiektu do drugiego, jednocześnie zabezpieczając się przed tym, że nie przekażemy nadmiarowej właściwości.
Przyjrzyjmy się następującemu przykładowi. Wróćmy
do funkcji myFunc, określającej
długość zmiennej:
function myFunc <T> (data: T): T {
console.log(data.length); // błąd
return data;
}
Teraz jednak chcemy, aby ta funkcja
działała tylko z tymi typami, które
mają właściwość length. W tym celu utwórzmy
interfejs ILength, któremu przypiszemy
właściwość length typu liczbowego:
interface ILength {
length: number;
}
Następnie w naszej funkcji ustawmy typ generyczny,
który dziedziczy po ILength
poprzez słowo kluczowe extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Oto jak wygląda nasz pełny kod:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Sprawdźmy działanie naszej funkcji i znajdźmy długość ciągu znaków:
console.log(myFunc('abcde'));
Wynik wykonanego kodu:
5
'abcde'
A teraz przekażmy do parametru tablicę:
console.log(myFunc(['a', 'b', 'c']));
Wynik wykonanego kodu:
3
[ 'a', 'b', 'c' ]