The Codest
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Industrie
    • Fintech e banche
    • E-commerce
    • Adtech
    • Tecnologia della salute
    • Produzione
    • Logistica
    • Automotive
    • IOT
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
Freccia indietro TORNA INDIETRO
2020-05-26
Sviluppo di software

Generici in TypeScript

Mateusz Staniuk

I generici forniscono pezzi di codice riutilizzabili che funzionano con una serie di tipi invece che con un singolo tipo. I generici forniscono un modo per trattare il tipo come una variabile e specificarlo al momento dell'uso, in modo simile ai parametri delle funzioni.

I generici possono essere usati insieme alle funzioni (creando funzioni generiche), alle classi (creando classi generiche) e alle interfacce (creando interfacce generiche).

Utilizzo di base

Probabilmente avete usato i generici in passato anche senza saperlo: l'uso più comune dei generici è la dichiarazione di un array:

const myArray: stringa[];

A prima vista non è nulla di speciale, ci limitiamo a dichiarare myArray come array di stringhe, ma è uguale a una dichiarazione generica:

const myArray: Array;

Mantenere le cose esplicite

Cominciamo con un esempio molto semplice: come possiamo portare questa funzione JS vanilla su TypeScript:

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

Questa funzione restituisce un array riempito con la quantità data di riempimento, quindi lunghezza sarà numero e l'intera funzione restituirà un array di riempimento - ma cos'è il riempimento? A questo punto può essere qualsiasi cosa, quindi un'opzione è quella di utilizzare qualsiasi:

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

Utilizzo qualsiasi è certamente generico - possiamo passare letteralmente qualsiasi cosa, quindi "lavorare con un certo numero di tipi invece che con un singolo tipo" dalla definizione è pienamente coperto, ma perdiamo la connessione tra riempimento e il tipo di ritorno. In questo caso, vogliamo restituire una cosa comune e possiamo definire esplicitamente questa cosa comune come parametro tipo:

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

e utilizzare in questo modo:

const prefilledArray = getPrefiledArray(0, 10);

Vincoli generici

Esaminiamo casi diversi, probabilmente più comuni. Perché usiamo i tipi nelle funzioni? Per me, è per garantire che gli argomenti passati alla funzione abbiano alcune proprietà con cui voglio interagire.

Ancora una volta proviamo a portare una semplice funzione JS vanilla in TS.

funzione getLength(thing) {
    restituisce thing.length;
}

Abbiamo un enigma non banale: come garantire che la cosa abbia un lunghezza e il primo pensiero potrebbe essere quello di fare qualcosa di simile:

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

e a seconda del contesto potrebbe essere corretto, nel complesso siamo un po' generici - funzionerà con array di più tipi, ma cosa succede se non sappiamo se l'oggetto deve essere sempre un array - forse l'oggetto è un campo da calcio o una buccia di banana? In questo caso, dobbiamo raccogliere le proprietà comuni di quell'oggetto in un costrutto che possa definire le proprietà di un oggetto - un'interfaccia:

interfaccia IThingWithLength {
  lunghezza: numero;
}

Possiamo utilizzare IThingConLunghezza come tipo dell'interfaccia cosa parametro:

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

francamente in questo semplice esempio andrà benissimo, ma se vogliamo mantenere questo tipo generico e non affrontare il problema del primo esempio possiamo usare Vincoli generici:

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

e utilizzarlo:

interfaccia IBananaPeel {
  spessore: numero;
  lunghezza: numero;
}

const bananaPeel: IBananaPeel = {spessore: 0,2, lunghezza: 3,14};
getLength(bananaPeel);

Utilizzo si estende assicura che T conterrà proprietà definite da IThingConLunghezza.

Classi generiche

Fino a questo punto, abbiamo lavorato con funzioni generiche, ma non è l'unico posto in cui i generici brillano: vediamo come incorporarli nelle classi.

Prima di tutto, proviamo a conservare un mucchio di banane nel cestino delle banane:

classe Banana {
  costruttore(
    public lunghezza: numero,
    public colore: stringa,
    public radiazione ionizzante: numero
  ) {}
}

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

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

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

Ora proviamo a creare un cestino generico, per diverse cose con lo stesso tipo:

classe Cestino {
  private stuff: T[] = [];

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

const bananaBasket = new Basket();

Infine, supponiamo che il nostro cestino sia un contenitore di materiale radioattivo e che si possa immagazzinare solo materia che abbia radiazioni ionizzanti proprietà:

interfaccia IRadioactive {
  ionizingRadiation: numero;
}

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

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

Interfaccia generica

Infine, cerchiamo di raccogliere tutte le nostre conoscenze e di costruire un impero radioattivo utilizzando anche le interfacce generiche:

// Definire gli attributi comuni per i contenitori
interfaccia IRadioactive {
  ionizingRadiation: number;
}


// Definisce qualcosa che è radioattivo
interfaccia IBanana estende IRadioactive {
  lunghezza: numero;
  colore: stringa;
}

// Definisce qualcosa che non è radioattivo
interfaccia IDog {
  peso: numero;
}

// Definisce un'interfaccia per un contenitore che può contenere solo materiale radioattivo
interface IRadioactiveContainer {
  add(thing: T): void;
  getRadioactiveness():number;
}

// Definire la classe che implementa l'interfaccia del contenitore radioattivo
class 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)
  }
}

// ERRORE! Il tipo 'IDog' non soddisfa il vincolo 'IRadioactive'.
// Ed è piuttosto brutale memorizzare i cani all'interno del contenitore radioattivo
const dogsContainer = new RadioactiveContainer();

// Tutto bene!
const radioactiveContainer = new RadioactiveContainer();

// Ricordarsi di differenziare i rifiuti radioattivi - creare un contenitore separato solo per le banane
const bananasContainer = new RadioactiveContainer();

Questo è tutto, gente!

Articoli correlati

Illustrazione astratta di un grafico a barre in calo con una freccia in aumento e una moneta d'oro che simboleggia l'efficienza dei costi o il risparmio. Il logo The Codest appare nell'angolo in alto a sinistra con lo slogan "In Code We Trust" su uno sfondo grigio chiaro.
Sviluppo di software

Come scalare il team di sviluppo senza perdere la qualità del prodotto

Scalare il team di sviluppo? Scoprite come crescere senza sacrificare la qualità del prodotto. Questa guida tratta i segnali che indicano che è arrivato il momento di scalare, la struttura del team, le assunzioni, la leadership e gli strumenti, oltre a come The Codest può...

IL CANCRO
Sviluppo di software

Costruire applicazioni web a prova di futuro: le intuizioni del team di esperti di The Codest

Scoprite come The Codest eccelle nella creazione di applicazioni web scalabili e interattive con tecnologie all'avanguardia, offrendo esperienze utente senza soluzione di continuità su tutte le piattaforme. Scoprite come la nostra esperienza favorisce la trasformazione digitale e il business...

IL CANCRO
Sviluppo di software

Le 10 principali aziende di sviluppo software con sede in Lettonia

Scoprite le migliori aziende di sviluppo software della Lettonia e le loro soluzioni innovative nel nostro ultimo articolo. Scoprite come questi leader tecnologici possono aiutarvi a migliorare la vostra attività.

thecodest
Soluzioni per aziende e scaleup

Essenziali di sviluppo software Java: Guida all'outsourcing di successo

Esplorate questa guida essenziale sullo sviluppo di software Java con successo outsourcing per migliorare l'efficienza, accedere alle competenze e guidare il successo del progetto con The Codest.

thecodest
Sviluppo di software

La guida definitiva all'outsourcing in Polonia

L'aumento di outsourcing in Polonia è guidato dai progressi economici, educativi e tecnologici, che favoriscono la crescita dell'IT e un clima favorevole alle imprese.

IlCodesto

Iscrivetevi alla nostra knowledge base e rimanete aggiornati sulle competenze del settore IT.

    Chi siamo

    The Codest - Società internazionale di sviluppo software con centri tecnologici in Polonia.

    Regno Unito - Sede centrale

    • Ufficio 303B, 182-184 High Street North E6 2JA
      Londra, Inghilterra

    Polonia - Poli tecnologici locali

    • Parco uffici Fabryczna, Aleja
      Pokoju 18, 31-564 Cracovia
    • Ambasciata del cervello, Konstruktorska
      11, 02-673 Varsavia, Polonia

      The Codest

    • Casa
    • Chi siamo
    • Servizi
    • Case Studies
    • Sapere come
    • Carriera
    • Dizionario

      Servizi

    • Consulenza
    • Sviluppo di software
    • Sviluppo backend
    • Sviluppo Frontend
    • Staff Augmentation
    • Sviluppatori backend
    • Ingegneri del cloud
    • Ingegneri dei dati
    • Altro
    • Ingegneri QA

      Risorse

    • Fatti e miti sulla collaborazione con un partner esterno per lo sviluppo di software
    • Dagli Stati Uniti all'Europa: Perché le startup americane decidono di trasferirsi in Europa
    • Confronto tra gli hub di sviluppo Tech Offshore: Tech Offshore Europa (Polonia), ASEAN (Filippine), Eurasia (Turchia)
    • Quali sono le principali sfide di CTO e CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Condizioni di utilizzo del sito web

    Copyright © 2025 di The Codest. Tutti i diritti riservati.

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