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:

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

typescriptinterface ILength {
  length: number;
}

Następnie w naszej funkcji ustawmy typ generyczny, który dziedziczy po ILength poprzez słowo kluczowe extends:

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

Oto jak wygląda nasz pełny kod:

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

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

Wynik wykonanego kodu:

typescript5
'abcde'

A teraz przekażmy do parametru tablicę:

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

Wynik wykonanego kodu:

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