Typescript e la programmazione funzionale

Abbiamo visto le tecniche proposte dalla programmazione orientata agli oggetti per organizzare dinamicamente dati e funzioni e discriminare tra diverse casistiche; vediamo, ora, come le stesse problematiche vengono affrontate in programmazione funzionale. Ripartiamo, dunque, dal nostro solito contatore e vediamo come questo verrebbe gestito in FP. Poiché qui le funzioni sono intese in senso matematico, […]
Typescript e la programmazione orientata agli oggetti

La programmazione orientata agli oggetti (in inglese object-oriented programming, abbreviato OOP), nella sua accezione più classica, punta ad utilizzare le tecniche e i paradigmi della programmazione procedurale in contesti isolati divisi per aree di competenza e comunicanti attraverso l’invocazione di metodi. Le classi nella programmazione ad oggetti L’OOP implementa questo tipo di organizzazione utilizzando il […]
Moduli e namespace in Typescript

Il primo livello di organizzazione architetturale del nostro codice è abbastanza integrato nelle moderne versioni di JavaScript; si tratta dei moduli. I moduli (o concetti ad essi analoghi) costituiscono la base di organizzazione del codice in praticamente tutti i linguaggi di programmazione. Lo scopo di un sistema di moduli è molteplice: dividere il codice in […]
Typescript e la programmazione procedurale/Scripting

Lungo tutta la guida la conoscenza di TypeScript e del suo sistema di tipi sono state il fulcro della nostra trattazione. Ma, in fin dei conti, un linguaggio di programmazione è tanto efficace quanto è espressivo e ci permette di organizzare il codice in un modo che rappresenti e descriva la realtà del dominio in […]
Tipi utility in Typescript

Se volessimo ricapitolare quello che abbiamo imparato sul type system, potremmo sintetizzarlo così: TypeScript parte dai primitivi, i tipi nativamente presenti nel linguaggio JavaScript, e aggiunge un insieme di definizioni per vincolare la struttura di oggetti e array. Tali definizioni seguono una gerarchia nominale di tipi veri e propri costituiti dalle nostre interfacce, più una […]
Manipolazione di tipi in Typescript

A questo punto, abbiamo tutti gli strumenti per usare il type system come un vero e proprio linguaggio di programmazione a compile time. In questa sezione vedremo come creare tipi a partire da altri tipi, sfruttando vincoli e condizioni per creare complesse strutture a partire da pochi tipi di riferimento o persino da dati JavaScript […]
Parametri di tipo in Typescript

A volte può tornarci comodo parametrizzare i tipi allo stesso modo in cui facciamo con i dati. Prendiamo una funzione estremamente semplice, che accetta un dato e ritorna lo stesso dato immutato; come definiremmo la sua firma in TypeScript? const identity = x => x; // identity: ?? In questo esempio, TypeScript si limita […]
Tipi algebrici in Typescript

Nelle sezioni iniziali di questa guida abbiamo parlato del fatto che TypeScript offre un type system statico, e questo comporta che una variabile non possa cambiare tipo durante il suo ciclo di vita. Eppure, sappiamo che il nostro codice TypeScript è destinato a diventare JavaScript, che invece ha un type system dinamico. Come abbiamo visto […]
Any vs unknown in Typescript

Più indietro in questa guida, in un esempio abbiamo parlato della funzione JSON.parse e del suo tipo di ritorno any; riprendiamo l’esempio: const data = JSON.parse(‘{ “name”: “John” }’); // const data: any console.log(data.name); Abbiamo già visto come dire a TypeScript di assumere che data sia di un certo tipo, e abbiamo anche visto […]
Guardie di tipo in Typescript

Un caso d’uso particolare delle funzioni è quello di usarle per fare type narrowing, cioè per verificare se un dato sia di un certo tipo. Abbiamo già parlato di restringimento di tipo in Typescript, facendo esempi come il seguente: function concat(a: string | number, b: string | number): string { if (typeof a === […]
Funzioni in Typescript

Veniamo, ora, ad un altro tassello fondamentale di ogni linguaggio di programmazione: le funzioni. In TypeScript esistono diversi modi per tipizzare una funzione, ricalcando i diversi modi con cui una funzione può essere implementata in JavaScript. Iniziamo con la definizione più comune, quella introdotta dalla parola chiave function function: function sum(a: number, b: number): […]
Array e tuple in Typescript

Array in Typescript Nel linguaggio JavaScript, un elenco ordinato di dati è rappresentato da un array; in TypeScript, gli array sono elenchi ordinati di dati dello stesso tipo. Ecco qualche esempio di array in TypeScript: // array di stringhe const greetings: string[] = [“hello”, “hi”]; // array di numeri const oneToFive: number[] = [1, […]
Oggetti in Typescript

Nel linguaggio JavaScript, praticamente ogni cosa è un oggetto ad eccezione dei tipi primitivi. Un oggetto è, fondamentalmente, una collezione di coppie chiave/valore (in inglese: key/value pair); in informatica, una simile struttura di dati è spesso chiamata mappa, dizionario o record. Non confondiamo il fatto che un oggetto risponda alla definizione di mappa con la […]
Tipi enumerativi in Typescript

A volte ci troviamo in presenza di tipi di dato il cui unico scopo è quello di discriminare tra un elenco finito di opzioni. Prendiamo ad esempio la seguente funzione, che presenta uno switch statement: function log(level: string, message: string): void { switch (level) { case “log”: console.log(message); return; case “info”: console.info(message); return; case […]
Null e undefined in Typescript

Un’altra combinazione frequentissima avviene tra i tipi null e undefined e altri tipi, a indicare che un dato potrebbe essere valorizzato oppure mancante. Prendiamo l’API standard del localStorage, disponibile in tutti i browser: localStorage.getItem(“key”); // getItem(): string | null In questo caso, getItem restituisce un valore stringa oppure niente, e niente è rappresentato dal […]
Tipi letterali in Typescript

In aggiunta ai tipi primitivi, TypeScript offre un modo molto vantaggioso per vincolare la definizione di un tipo a uno o più specifici valori letterali che una data variabile può assumere, o che una data funzione può restituire. Prendiamo il seguente esempio: let a = 1; // a: number const b = 1; // […]
Tipi primitivi in Typescript

Essendo TypeScript un linguaggio che include JavaScript, come base di partenza il suo sistema di tipi ricalca i tipi primitivi esistenti a runtime; dunque ritroviamo i già noti string, number, boolean. A questi si aggiungono i tipi object e array, che però individuano intere categorie di sottotipi e per questo li vedremo più avanti nel […]
Integrazione di Typescript con IDE

Finora abbiamo imparato che, grazie alle dichiarazioni e alle annotazioni di tipo, TypeScript fornisce un potente sistema di prevenzione contro errori in esecuzione (a runtime). Un altro motivo per cui questo linguaggio ha visto un enorme successo tra gli sviluppatori sta nel fatto che TypeScript costituisce anche un potente alleato nella consultazione e scrittura del […]