Tüübi parameetrite kasutamine TypeScripti generikumite piirangutes

TypeScriptis on ka võimalik deklareerida üks tüübi parameeter, mis on piiratud teise tüübi parameetriga. See on vajalik, kui tuleb kopeerida omadusi ühest objektist teise, samal ajal kaitstes end selle eest, et me ei edastaks liigset omadust.

Vaatame järgmist näidet. Pöördume tagasi funktsiooni myFunc juurde, mis määrab muutuja pikkuse:

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

Kuid nüüd tahame, et see funktsioon töötaks ainult nende tüüpidega, millel on omadus length. Selleks loome liidese ILength, millele määrame omaduse length numbrilise tüübiga:

typescriptinterface ILength {
  length: number;
}

Järgmisena määrame oma funktsioonis generiseeritud tüübi, mis pärineb ILength-st kasutades võtmesõna extends:

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

Meie täielik kood näeb välja selline:

typescriptinterface ILength {
  length: number;
}

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

Kontrollime oma funktsiooni tööd ja leiame stringi pikkuse:

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

Koodi täitmise tulemus:

typescript5
'abcde'

Ja nüüd edastame parameetrina massiivi:

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

Koodi täitmise tulemus:

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