Použití typových parametrů v omezeních generik v TypeScriptu

TypeScript také umožňuje deklaraci jednoho typového parametru, který bude omezen jiným typovým parametrem. To je nezbytné, když je potřeba kopírovat vlastnosti z jednoho objektu do druhého a zároveň se pojistit proti tomu, že nepředáme nadbytečnou vlastnost.

Podívejme se na následující příklad. Znovu přejděme k funkci myFunc, která určuje délku proměnné:

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

Nyní však chceme, aby tato funkce pracovala pouze s těmi typy, které mají vlastnost length. K tomu vytvoříme rozhraní ILength, kterému nastavíme vlastnost length číselného typu:

typescriptinterface ILength {
  length: number;
}

Dále v naší funkci nastavme generický typ, který dědí od ILength pomocí klíčového slova extends:

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

Takhle vypadá náš úplný kód:

typescriptinterface ILength {
  length: number;
}

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

Pojďme otestovat funkčnost naší funkce a najděme délku řetězce:

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

Výsledek provedeného kódu:

typescript5
'abcde'

A nyní předáme do parametru pole:

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

Výsledek provedeného kódu:

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