Full Stack

La parola chiave Type in TypeScript

Autore

Manuel Ricci

Nel mondo della programmazione, specialmente quando si lavora con linguaggi tipizzati come TypeScript, emergono spesso domande riguardo l'uso di "type alias" (alias di tipo) e interfacce. Questi due costrutti sono fondamentali per definire e manipolare tipi di dati complessi, ma presentano caratteristiche e use case specifici.

Che cosa sono i Type Alias?

Un "type alias" in TypeScript è un modo per dare un nome a un tipo di dato. Può essere semplice o complesso e può rappresentare quasi qualsiasi tipo di dato, incluso union e intersection types. Un esempio di type alias potrebbe essere:

1type Point = {
2    x: number;
3    y: number;
4};

In questo caso, Point è un alias per un tipo di oggetto con due proprietà numeriche, x e y.

Vantaggi dei Type Alias

Flessibilità: I type alias possono rappresentare una vasta gamma di tipi, dai più semplici ai più complessi.

Ecco un esempio:

1type RGB = [number, number, number];
2
3const red: RGB = [255, 0, 0];

Type alias con tuple

Componibilità: Possono essere combinati per creare tipi più complessi utilizzando union o intersection types. Ecco qualche esempio:

1type StringOrNumber = string | number;
2
3let myVar: StringOrNumber;
4myVar = "Hello"; // valido
5myVar = 42;      // valido

Type alias con Union Type

1type Point = {
2    x: number;
3    y: number;
4};
5
6type LabeledPoint = Point & { label: string };
7
8let labeledPt: LabeledPoint = {
9    x: 1,
10    y: 2,
11    label: "A point"
12};

Type alias con intersection type

Svantaggi dei Type Alias

  1. Non Estendibili: A differenza delle interfacce, non possono essere estesi o implementati da altre classi.
  2. Limitati nelle Dichiarazioni Merged: Non supportano la dichiarazione merging come le interfacce.

Che cosa sono le Interfacce?

Le interfacce, d'altra parte, sono un modo per definire la forma di un oggetto. Sono più strutturate e offrono una maggiore enfasi sull'integrazione e la coerenza del tipo. Un esempio di interfaccia potrebbe essere:

1interface Point {
2    x: number;
3    y: number;
4}
5
6const myPoint: Point = { x: 10, y: 20 };

Anche qui, abbiamo definito un tipo Point, ma attraverso un'interfaccia.

Vantaggi delle Interfacce

Estensibilità: Le interfacce possono essere estese da altre interfacce, offrendo una maggiore flessibilità nella costruzione di tipi complessi.

1interface Shape {
2    color: string;
3}
4
5interface Circle extends Shape {
6    radius: number;
7}
8
9const myCircle: Circle = { color: "blue", radius: 5 };

Dichiarazione Merging: TypeScript consente alle interfacce di fondersi se dichiarate più volte, il che è utile in certi scenari di programmazione.

1interface Box {
2    height: number;
3}
4
5interface Box {
6    width: number;
7}
8
9// Box ora ha sia height che width
10const box: Box = { height: 10, width: 20 };

N.B. Questo non è possibile con type alias

Svantaggi delle Interfacce

  1. Non adatte per Union o Intersection Types: Le interfacce non sono ideali per rappresentare tipi che sono unioni o intersezioni di altri tipi.
  2. Meno Flessibilità in alcuni Contesti: A differenza dei type alias, le interfacce sono leggermente meno flessibili per definire tipi che non rappresentano oggetti.

Quando usare Type Alias o Interfacce?

La scelta tra type alias e interfacce dipende da diversi fattori:

  • Estensibilità: Se prevedi di estendere o personalizzare il tipo in futuro, le interfacce sono più adatte.
  • Complessità del Tipo: Per tipi complessi che utilizzano unioni o intersezioni, i type alias sono più indicati.
  • Consistenza e Integrazione: Se è necessario garantire una consistenza del tipo all'interno di un progetto o un'API, le interfacce possono essere la scelta migliore.
  • Preferenza Personale e Stile di Codifica: A volte, la scelta può anche basarsi sulle preferenze personali e sullo stile di codifica del team.

Notare bene che non è una scelta esclusiva, type alias e interfacce possono essere usati anche insieme:

1interface Circle {
2    kind: "circle";
3    radius: number;
4}
5
6interface Square {
7    kind: "square";
8    sideLength: number;
9}
10
11type Shape = Circle | Square;
12
13function handleShape(shape: Shape) {
14    if (shape.kind === "circle") {
15        // gestisce il Circle
16    } else {
17        // gestisce il Square
18    }
19}

Conclusione

Sia i type alias che le interfacce sono strumenti potenti in TypeScript e altri linguaggi di programmazione tipizzati. La comprensione delle loro differenze e dei casi d'uso appropriati può migliorare significativamente la qualità del codice e la manutenibilità dei progetti software.

In definitiva, la scelta tra i due dovrebbe basarsi su considerazioni pratiche relative alla natura del progetto e alle necessità specifiche del codice che stai scrivendo.

Caricamento...

Diventiamo amici di penna? ✒️

Iscriviti alla newsletter per ricevere una mail ogni paio di settimane con le ultime novità, gli ultimi approfondimenti e gli ultimi corsi gratuiti puubblicati. Ogni tanto potrei scrivere qualcosa di commerciale, ma solo se mi autorizzi, altrimenti non ti disturberò oltre.

Se non ti piace la newsletter ti ricordo la community su Discord, dove puoi chiedere aiuto, fare domande e condividere le tue esperienze (ma soprattutto scambiare due meme con me). Ti aspetto!

Ho in previsione di mandarti una newsletter ogni due settimane e una commerciale quando capita.