window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = vindue if (w.LeadBooster) { console.warn('LeadBooster findes allerede') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Generiske lægemidler i TypeScript - The Codest
Codest
  • Om os
  • Serviceydelser
    • Udvikling af software
      • Frontend-udvikling
      • Backend-udvikling
    • Staff Augmentation
      • Frontend-udviklere
      • Backend-udviklere
      • Dataingeniører
      • Cloud-ingeniører
      • QA-ingeniører
      • Andet
    • Det rådgivende
      • Revision og rådgivning
  • Industrier
    • Fintech og bankvirksomhed
    • E-commerce
    • Adtech
    • Sundhedsteknologi
    • Produktion
    • Logistik
    • Biler
    • IOT
  • Værdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leder af levering
  • Vores team
  • Casestudier
  • Ved hvordan
    • Blog
    • Møder
    • Webinarer
    • Ressourcer
Karriere Tag kontakt til os
  • Om os
  • Serviceydelser
    • Udvikling af software
      • Frontend-udvikling
      • Backend-udvikling
    • Staff Augmentation
      • Frontend-udviklere
      • Backend-udviklere
      • Dataingeniører
      • Cloud-ingeniører
      • QA-ingeniører
      • Andet
    • Det rådgivende
      • Revision og rådgivning
  • Værdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leder af levering
  • Vores team
  • Casestudier
  • Ved hvordan
    • Blog
    • Møder
    • Webinarer
    • Ressourcer
Karriere Tag kontakt til os
Pil tilbage GÅ TILBAGE
2020-05-26
Udvikling af software

Generiske lægemidler i TypeScript

Mateusz Staniuk

Generics giver genanvendelige kodestykker, der fungerer med et antal typer i stedet for en enkelt type. Generics giver mulighed for at behandle typen som en variabel og specificere den ved brug, ligesom funktionsparametre.

Generics kan bruges i forbindelse med funktioner (oprettelse af generiske funktioner), klasser (oprettelse af generiske klasser) og grænseflader (oprettelse af generiske grænseflader).

Grundlæggende brug

Du har sikkert brugt generics tidligere uden at vide det - den mest almindelige brug af generics er at erklære et array:

const myArray: string[];

Det er ikke så specielt ved første øjekast, vi erklærer bare myArray som et array af strenge, men det er det samme som en generisk erklæring:

const myArray: Array;

At holde tingene eksplicitte

Lad os starte med et meget simpelt eksempel - hvordan kan vi overføre denne vanilje-JS-funktion til TypeScript:

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

Denne funktion returnerer et array fyldt med den givne mængde Fyldstofså længde vil være nummer og hele funktionen vil returnere et array af Fyldstof - Men hvad er fyldstof? På dette tidspunkt kan det være hvad som helst, så en mulighed er at bruge nogen:

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

Brug af nogen er bestemt generisk - vi kan sende bogstaveligt talt hvad som helst, så "arbejde med et antal typer i stedet for en enkelt type" fra definitionen er fuldt ud dækket, men vi mister forbindelsen mellem Fyldstof typen og returtypen. I dette tilfælde ønsker vi at returnere en fælles ting, og vi kan eksplicit definere denne fælles ting som type parameter:

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

og bruge det sådan her:

const prefilledArray = getPrefiledArray(0, 10);

Generiske begrænsninger

Lad os se på andre og nok mere almindelige tilfælde. Hvorfor bruger vi egentlig typer i funktioner? For mig er det for at sikre, at de argumenter, der sendes til funktionen, har nogle egenskaber, som jeg ønsker at interagere med.

Lad os endnu en gang prøve at overføre en simpel vanilje-JS-funktion til TS.

funktion getLength(ting) {
    return thing.length;
}

Vi har en ikke-triviel gåde - hvordan sikrer vi, at tingen har en længde ejendom, og den første tanke er måske at gøre noget lignende:

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

og afhængigt af konteksten kan det være korrekt, generelt er vi lidt generiske - det fungerer med arrays af flere typer, men hvad nu hvis vi ikke rigtig ved, om tingen altid skal være en array - måske er tingen en fodboldbane eller en bananskræl? I så fald er vi nødt til at samle de fælles egenskaber for den ting i en konstruktion, der kan definere egenskaber for et objekt - et interface:

interface IThingWithLength {
  længde: antal;
}

Vi kan bruge ITingWithLength interface som type af ting parameter:

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

I dette enkle eksempel er det helt fint, men hvis vi ønsker at holde denne type generisk og ikke stå over for problemet fra det første eksempel, kan vi bruge Generiske begrænsninger:

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

og bruge det:

interface IBananaPeel {
  tykkelse: number;
  længde: nummer;
}

const bananaPeel: IBananaPeel = {tykkelse: 0,2, længde: 3,14};
getLength(bananaPeel);

Brug af strækker sig sikrer, at T vil indeholde egenskaber, der er defineret af ITingWithLength.

Generiske klasser

Indtil nu har vi arbejdet med generiske funktioner, men det er ikke det eneste sted, hvor generiske funktioner brillerer, så lad os se, hvordan vi kan indarbejde dem i klasser.

Lad os først prøve at opbevare en masse bananer i banankurven:

klasse Banan {
  konstruktør(
    offentlig længde: tal,
    offentlig farve: streng,
    offentlig ioniserende stråling: tal
  ) {}
}

klasse 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));

Lad os nu prøve at skabe en generel kurv til forskellige ting med samme type:

klasse Kurv {
  private ting: T[] = [];

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

const bananaBasket = new Basket();

Og lad os til sidst antage, at vores kurv er en beholder til radioaktivt materiale, og at vi kun kan opbevare materiale, der har ioniserende stråling ejendom:

interface IRadioactive {
  ionizingRadiation: number;
}

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

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

Generisk grænseflade

Lad os til sidst prøve at samle al vores viden og bygge et radioaktivt imperium, der også bruger generiske interfaces:

// Definer fælles attributter for containere
interface IRadioactive {
  ionizingRadiation: number;
}


// Definer noget, der er radioaktivt
interface IBanana extends IRadioactive {
  length: number;
  farve: streng;
}

// Definer noget, der ikke er radioaktivt
interface IDog {
  vægt: nummer;
}

// Definer grænseflade for beholder, der kun kan indeholde radioaktive ting
interface IRadioactiveContainer {
  add(thing: T): void;
  getRadioactiveness():number;
}

// Definer klasse, der implementerer interface for radioaktiv beholder
class RadioactiveContainer implementerer IRadioactiveContainer {
  private stuff: T[] = [];

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

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

// FEJL! Typen 'IDog' opfylder ikke betingelsen 'IRadioactive'
// Og det er ret brutalt at opbevare hunde i en radioaktiv container
const dogsContainer = new RadioactiveContainer();

// Alt er godt fam!
const radioactiveContainer = new RadioactiveContainer();

// Husk at sortere dit radioaktive affald - lav en separat beholder kun til bananer
const bananasContainer = new RadioactiveContainer();

Det var alt, folkens!

Relaterede artikler

Udvikling af software

Byg fremtidssikrede webapps: Indsigt fra The Codest's ekspertteam

Oplev, hvordan The Codest udmærker sig ved at skabe skalerbare, interaktive webapplikationer med banebrydende teknologier, der leverer sømløse brugeroplevelser på tværs af alle platforme. Lær, hvordan vores ekspertise driver digital transformation og...

DENKODEST
Udvikling af software

Top 10 Letlands-baserede softwareudviklingsvirksomheder

Læs om Letlands bedste softwareudviklingsvirksomheder og deres innovative løsninger i vores seneste artikel. Find ud af, hvordan disse teknologiledere kan hjælpe med at løfte din virksomhed.

thecodest
Løsninger til virksomheder og scaleups

Grundlæggende om Java-softwareudvikling: En guide til succesfuld outsourcing

Udforsk denne vigtige guide til vellykket outsourcing af Java-softwareudvikling for at forbedre effektiviteten, få adgang til ekspertise og skabe projektsucces med The Codest.

thecodest
Udvikling af software

Den ultimative guide til outsourcing i Polen

Den voldsomme stigning i outsourcing i Polen er drevet af økonomiske, uddannelsesmæssige og teknologiske fremskridt, der fremmer it-vækst og et erhvervsvenligt klima.

TheCodest
Løsninger til virksomheder og scaleups

Den komplette guide til IT-revisionsværktøjer og -teknikker

IT-revisioner sikrer sikre, effektive og kompatible systemer. Lær mere om deres betydning ved at læse hele artiklen.

Codest
Jakub Jakubowicz CTO og medstifter

Tilmeld dig vores vidensbase, og hold dig opdateret om ekspertisen fra it-sektoren.

    Om os

    The Codest - International softwareudviklingsvirksomhed med tech-hubs i Polen.

    Storbritannien - Hovedkvarter

    • Kontor 303B, 182-184 High Street North E6 2JA
      London, England

    Polen - Lokale teknologiske knudepunkter

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Hjerneambassaden, Konstruktorska
      11, 02-673 Warszawa, Polen

      Codest

    • Hjem
    • Om os
    • Serviceydelser
    • Casestudier
    • Ved hvordan
    • Karriere
    • Ordbog

      Serviceydelser

    • Det rådgivende
    • Udvikling af software
    • Backend-udvikling
    • Frontend-udvikling
    • Staff Augmentation
    • Backend-udviklere
    • Cloud-ingeniører
    • Dataingeniører
    • Andet
    • QA-ingeniører

      Ressourcer

    • Fakta og myter om at samarbejde med en ekstern softwareudviklingspartner
    • Fra USA til Europa: Hvorfor beslutter amerikanske startups sig for at flytte til Europa?
    • Sammenligning af Tech Offshore-udviklingsknudepunkter: Tech Offshore Europa (Polen), ASEAN (Filippinerne), Eurasien (Tyrkiet)
    • Hvad er de største udfordringer for CTO'er og CIO'er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Vilkår for brug af hjemmesiden

    Copyright © 2025 af The Codest. Alle rettigheder forbeholdes.

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