The Codest
  • O nás
  • Služby
    • Vývoj softwaru
      • Vývoj frontendů
      • Vývoj backendu
    • Staff Augmentation
      • Vývojáři frontendů
      • Vývojáři backendu
      • Datoví inženýři
      • Cloudoví inženýři
      • Inženýři QA
      • Další
    • To Advisory
      • Audit a poradenství
  • Odvětví
    • Fintech a bankovnictví
    • E-commerce
    • Adtech
    • Healthtech
    • Výroba
    • Logistika
    • Automobilový průmysl
    • IOT
  • Hodnota za
    • CEO
    • CTO
    • Manažer dodávek
  • Náš tým
  • Case Studies
  • Vědět jak
    • Blog
    • Setkání
    • Webové semináře
    • Zdroje
Kariéra Spojte se s námi
  • O nás
  • Služby
    • Vývoj softwaru
      • Vývoj frontendů
      • Vývoj backendu
    • Staff Augmentation
      • Vývojáři frontendů
      • Vývojáři backendu
      • Datoví inženýři
      • Cloudoví inženýři
      • Inženýři QA
      • Další
    • To Advisory
      • Audit a poradenství
  • Hodnota za
    • CEO
    • CTO
    • Manažer dodávek
  • Náš tým
  • Case Studies
  • Vědět jak
    • Blog
    • Setkání
    • Webové semináře
    • Zdroje
Kariéra Spojte se s námi
Šipka zpět ZPĚT
2020-05-26
Vývoj softwaru

Generika v TypeScript

Mateusz Staniuk

Generika poskytují opakovaně použitelné části kódu, které pracují s řadou typů namísto jednoho typu. Generika poskytují způsob, jak zacházet s typem jako s proměnnou a specifikovat jej při použití, podobně jako parametry funkcí.

Generika lze použít ve spojení s funkcemi (vytvoření generické funkce), třídami (vytvoření generické třídy) a rozhraními (vytvoření generického rozhraní).

Základní použití

Pravděpodobně jste v minulosti použili generika, aniž byste o tom věděli - nejčastějším použitím generik je deklarace pole:

const myArray: string[];

Na první pohled to není nic zvláštního, jen prohlašujeme. myArray jako pole řetězců, ale je to stejné jako obecná deklarace:

const myArray: Array;

Zachování explicitnosti

Začněme velmi jednoduchým příkladem - jak bychom mohli tuto vanilla JS funkci přenést do funkce TypeScript:

funkce getPrefiledArray(filler, length) {
    return (new Array(length)).fill(filler);
}

Tato funkce vrátí pole naplněné daným množstvím výplň, takže délka bude číslo a celá funkce vrátí pole výplň - ale co je to výplň? V tuto chvíli to může být cokoli, takže jednou z možností je použít jakýkoli:

function getPrefiledArray(filler: any, length: number): any[] {
    return (new Array(length)).fill(filler);
}

Používání stránek jakýkoli je jistě obecný - můžeme mu předat doslova cokoli, takže "práce s více typy místo s jedním typem" z definice je plně pokryta, ale ztrácíme vazbu mezi výplň a návratový typ. V tomto případě chceme vrátit nějakou společnou věc a tuto společnou věc můžeme explicitně definovat jako parametr typu:

funkce getPrefiledArray(filler: T, length: number): T[] {
    return (new Array(length)).fill(filler);
}

a použijte je takto:

const prefilledArray = getPrefiledArray(0, 10);

Obecná omezení

Podívejme se na jiné, pravděpodobně častější případy. Proč vlastně používáme typy ve funkcích? Pro mě je to proto, abych zajistil, že argumenty předávané funkci budou mít nějaké vlastnosti, se kterými chci interagovat.

Ještě jednou se pokusíme přenést jednoduchou funkci vanilla JS do TS.

funkce getLength(věc) {
    return thing.length;
}

Máme netriviální hádanku - jak zajistit, aby věc měla. délka a první myšlenkou může být něco jako:

funkce getLength(thing: typeof Array):number {
    return thing.length;
}

a v závislosti na kontextu to může být správně, celkově jsme trochu obecní - bude to fungovat s poli více typů, ale co když opravdu nevíme, jestli má být věc vždy pole - třeba je věc fotbalové hřiště nebo slupka od banánu? V takovém případě musíme shromáždit společné vlastnosti dané věci do konstrukce, která může definovat vlastnosti objektu - rozhraní:

rozhraní IThingWithLength {
  length: číslo;
}

Můžeme použít IThingWithLength jako typ rozhraní věc parametr:

funkce getLength(thing: IThingWithLength):number {
    return thing.length;
}

upřímně řečeno, v tomto jednoduchém příkladu to bude naprosto v pořádku, ale pokud chceme, aby tento typ byl obecný a neřešil se problém z prvního příkladu, můžeme použít typ Obecná omezení:

funkce getLength(thing: T):number {
    return thing.length;
}

a používat ji:

rozhraní IBananaPeel {
  thickness: číslo;
  délka: číslo;
}

const bananaPeel: IBananaPeel = {thickness: 0.2, length: 3.14};
getLength(bananaPeel);

Používání stránek rozšiřuje zajišťuje, že T bude obsahovat vlastnosti, které jsou definovány pomocí IThingWithLength.

Obecné třídy

Až do této chvíle jsme pracovali s generickými funkcemi, ale to není jediné místo, kde generika září, podívejme se, jak je můžeme začlenit do tříd.

Nejdříve si vyzkoušejte uložit trs banánů do košíku na banány:

třída Banana {
  constructor(
    public length: číslo,
    public color: string,
    public ionizingRadiation: number
  ) {}
}

class BananaBasket {
  private bananas: Banana[] = [];

  add(banana: Banana): void {
    this.bananas.push(banana);
  }
}

const bananaBasket = new BananaBasket();
bananaBasket.add(new Banana(3.14, 'red', 10e-7));

Nyní se pokusíme vytvořit koš pro všeobecné použití, pro různé věci stejného typu:

třída Basket {
  private stuff: T[] = [];

  add(věc: T): void {
    this.stuff.push(thing);
  }
}

const bananaBasket = new Basket();

A konečně, předpokládejme, že náš koš je kontejnerem na radioaktivní materiál a že do něj můžeme ukládat pouze hmotu, která má ionizující záření nemovitosti:

rozhraní IRadioactive {
  ionizingRadiation: number;
}

class RadioactiveContainer {
  private stuff: T[] = [];

  add(thing: T): void {
    this.stuff.push(thing);
  }
}

Obecné rozhraní

Nakonec se pokusíme shromáždit všechny naše znalosti a vybudovat radioaktivní říši také pomocí generických rozhraní:

// Definice společných atributů pro kontejnery
interface IRadioactive {
  ionizingRadiation: number;
}


// Definujte něco, co je radioaktivní
interface IBanana extends IRadioactive {
  length: number;
  color: string;
}

// Definujte něco, co není radioaktivní
rozhraní IDog {
  weight: number;
}

// Definujte rozhraní pro kontejner, který může obsahovat pouze radioaktivní věci.
interface IRadioactiveContainer {
  add(thing: T): void;
  getRadioactiveness():number;
}

// Definujte třídu implementující rozhraní radioaktivního kontejneru
třída RadioactiveContainer implements IRadioactiveContainer {
  private stuff: T[] = [];

  add(thing: T): void {
    this.stuff.push(thing);
  }

  getRadioactiveness(): number {
      return this.stuff.reduce((a, b) => a + b.ionizingRadiation, 0)
  }
}

// CHYBA! Typ 'IDog' nesplňuje omezení 'IRadioactive'
// A je docela brutální ukládat psy uvnitř radioaktivního kontejneru
const dogsContainer = new RadioactiveContainer();

// Všechno v pořádku, rodino!
const radioactiveContainer = new RadioactiveContainer();

// Nezapomeňte třídit radioaktivní odpad - vytvořte samostatný koš pouze pro banány.
const bananasContainer = new RadioactiveContainer();

To je vše, přátelé!

Související články

Ilustrace zdravotnické aplikace pro chytré telefony s ikonou srdce a rostoucím zdravotním grafem, označená logem The Codest, která představuje digitální zdraví a řešení HealthTech.
Vývoj softwaru

Softwarové vybavení pro zdravotnictví: a případy použití

Nástroje, na které se dnes zdravotnické organizace spoléhají, se v ničem nepodobají papírovým kartám z doby před desítkami let. zdravotnický software dnes podporuje zdravotnické systémy, péči o pacienty a moderní poskytování zdravotní péče v klinických a...

NEJKRÁSNĚJŠÍ
Abstraktní ilustrace klesajícího sloupcového grafu se stoupající šipkou a zlatou mincí symbolizující efektivitu nákladů nebo úspory. V levém horním rohu se zobrazuje logo The Codest se sloganem "In Code We Trust" na světle šedém pozadí.
Vývoj softwaru

Jak rozšířit tým vývojářů bez ztráty kvality produktu

Zvětšujete svůj vývojový tým? Zjistěte, jak růst, aniž byste museli obětovat kvalitu produktu. Tento průvodce se zabývá příznaky, že je čas na škálování, strukturou týmu, najímáním zaměstnanců, vedením a nástroji - a také tím, jak může The Codest...

NEJKRÁSNĚJŠÍ
Vývoj softwaru

Vytváření webových aplikací odolných vůči budoucnosti: postřehy týmu odborníků The Codest

Zjistěte, jak společnost The Codest vyniká při vytváření škálovatelných, interaktivních webových aplikací pomocí nejmodernějších technologií, které poskytují bezproblémové uživatelské prostředí na všech platformách. Zjistěte, jak naše odborné znalosti podporují digitální transformaci a obchodní...

NEJKRÁSNĚJŠÍ
Vývoj softwaru

10 nejlepších lotyšských společností zabývajících se vývojem softwaru

V našem nejnovějším článku se dozvíte o nejlepších lotyšských společnostech zabývajících se vývojem softwaru a jejich inovativních řešeních. Zjistěte, jak mohou tito technologičtí lídři pomoci pozvednout vaše podnikání.

thecodest
Podniková a škálovací řešení

Základy vývoje softwaru v jazyce Java: A Guide to Outsourcing Successfully

Prozkoumejte tuto základní příručku o úspěšném vývoji softwaru outsourcing Java, abyste zvýšili efektivitu, získali přístup k odborným znalostem a dosáhli úspěchu projektu s The Codest.

thecodest

Přihlaste se k odběru naší znalostní databáze a získejte aktuální informace o odborných znalostech z oblasti IT.

    O nás

    The Codest - Mezinárodní společnost zabývající se vývojem softwaru s technologickými centry v Polsku.

    Spojené království - ústředí

    • Kancelář 303B, 182-184 High Street North E6 2JA
      Londýn, Anglie

    Polsko - Místní technologická centra

    • Kancelářský park Fabryczna, Aleja
      Pokoju 18, 31-564 Krakov
    • Brain Embassy, Konstruktorska
      11, 02-673 Varšava, Polsko

      The Codest

    • Home
    • O nás
    • Služby
    • Case Studies
    • Vědět jak
    • Kariéra
    • Slovník

      Služby

    • To Advisory
    • Vývoj softwaru
    • Vývoj backendu
    • Vývoj frontendů
    • Staff Augmentation
    • Vývojáři backendu
    • Cloudoví inženýři
    • Datoví inženýři
    • Další
    • Inženýři QA

      Zdroje

    • Fakta a mýty o spolupráci s externím partnerem pro vývoj softwaru
    • Z USA do Evropy: Proč se americké startupy rozhodly přesídlit do Evropy?
    • Srovnání technických vývojových center v zahraničí: Tech Offshore Evropa (Polsko), ASEAN (Filipíny), Eurasie (Turecko)
    • Jaké jsou hlavní výzvy CTO a CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Copyright © 2026 by The Codest. Všechna práva vyhrazena.

    cs_CZCzech
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek pt_PTPortuguese cs_CZCzech