69 TS – Iniziamo con TypeScript

Attualmente TypeScript non può essere interpretato direttamente dal browser, ma deve essere transcodificato o transpilato, ovvero viene tradotto e ricompilato in una versione di JavaScript a nostra scelta. Con TypeScript, a differenza del linguaggio genitore, possiamo utilizzare la tipizzazione delle variabili, le interfaces, enum e molte altre caratteristiche utilizzate da altri linguaggi di programmazione.

TypeScript può essere installato direttamente dal sito ufficiale, per verificarne la versione basterà lanciare il seguente comando:

tsc -v

Si presume che si abbia installato node.js, per ulteriori informazioni su node, vedere qui .

I file TypeScript hanno estensione ts, creando un file index.ts, per esempio, lo si può far ricomppilare anche da terminale col comando

tic index.js

ed avremo a disposizione il relativo file index.js. Possiamo anche decidere di modificare il nome del file js compilato

tic index.js --out pippo.js

Tutto quello che è presente in javascript, è presente anche in typescript. Come dicevamo ts ha la possibilità di tipizzare i dati, i tipi di dato primitivo esistenti sono :

Boolean, Number, String, Array, ObjectTuple, Enum.

Boolean

Sono tipi di dati che accettano un valore TRUE o FALSE

let isFinisched: boolean;

ho dichiarato una. variabile assegnandole il tipo bool. Nel relativo file js transcodificato otterrò:

var isFinished;

Se per esempio assegnassi alla variabile un valore diverso dal tipo dichiarato, otterrei un errore in fase di compilazione del js

isFinisched = 'Name';

Questo permette di ottenere un ulteriore verifica su eventuali sbagli.

Riassegniamo un valore corretto

isFinisched = true;
isFinisched = false;

Posso anche assegnare qualsiasi espressione che restituisca un valore booleano

isFinisched = 4 < 5;

String

Classiche variabili di tipo testo

let myname: string;

Un esempio può essere anche un numero racchiuso tra apici

minare = '5';

Number

sono tutti i numeri. Posso anche specificare un valore nello stesso comando di dichiarazione del tipo

let age : number = 45;

se cambio il valore di age con uno float (virgola), l’assegnazione sarebbe corretta.

age = 45.55; //corretto
age = 'Name'; //Scorretto perché è una stringa

Non è necessario specificare il tipo di dato, con la prima assegnazione stabilisco il tipo

let lastName = 'Bribò';
lastName = 5;

Errore perché la prima assegnazione dice al linguaggio che lastName è di tipo stringa.

Array

Come in js sono i vettori contenenti più valori ai quali è assegnato un indice.

let months = ['G','F','M'];

In questo caso ts capisce automaticamente che questo è un array di tipo stringa, sarebbe come se specificassimo il tipo in questo modo

let months : string[] = ['G','F','M'];

se assegnassi un array numerico, genererei un errore

months = [3,3,33];

per dichiarare un array di tipo number

let numbers : number[] = [3,3,33];

Un altro modo per dichiarare i tipi di array in ts è usando il metodo generics, che è un nome a nostra scelta, detto placeholder, che viene dichiarato tra i simboli maggiore e minore, dopo la parola array

let fruits : array<string> = ['pippo','pluto','paperino'];

In questo caso specificando <string> dichiaro che l’array è di tipo stringa.

Oggetto

In modo identico a js posso creare dati di tipo oggetto

let obj =  {};

oggetto vuoto, se gli assegno il valore 5 sarebbe legittimo

obj = 5;

Posso convertire il numero in stringa come js

console.log(obj.toString());

Tuple

Un Tuple è quando abbiamo un array di dati e la quantità e i tipi sono conosciuti e non cambiano.

Supponendo che dobbiamo passare un array fisso di cui il primo valore è una stringa e il secondo un numero

let params : [string, number];
params = ['fag', 45]

Per esempio possiamo creare una funzione che riceve questo array come parametro

let params = ['fag' , 45 ];

function showData(par) {
    console.log(par[0] + ','+par[1]);
}

showData(params);

Se inserissimo dei dati non corrispondenti al tipo

showData( 11, 27);

verrebbe generato subito un errore, cosa che con javascript non veniva evidenziata.

Enum

Il tipo di dato enum viene utilizzato quando abbiamo dei codici a cui vogliamo assegnare dei nomi facilmente comprensibili.

Per esempio creiamo un oggetto di tipo enum chiamato DAYS con i giorni della settimana, per convenzione il nome dell’enum si mette in maiuscolo

enum DAYS {
    MON,
    TUE,
    WED,
    THU,
    FRI,
    SAT,
    SUN
}

La trasformazione automatica del file js verrebbe così:

var DAYS;
(function (DAYS) {
    DAYS[DAYS["MON"] = 0] = "MON";
    DAYS[DAYS["TUE"] = 1] = "TUE";
    DAYS[DAYS["WED"] = 2] = "WED";
    DAYS[DAYS["THU"] = 3] = "THU";
    DAYS[DAYS["FRI"] = 4] = "FRI";
    DAYS[DAYS["SAT"] = 5] = "SAT";
    DAYS[DAYS["SUN"] = 6] = "SUN";
})(DAYS || (DAYS = {}));

dichiarazione della variabile DAYS, una funzione che riceve days e poi gli passa i vari valori tramite array.

Vediamo cosa contiene DAYS

console.log(DAYS);

e lanciamolo in modo rapido con node.js

node index.js

ecco l’output

{
  '0': 'MON',
  '1': 'TUE',
  '2': 'WED',
  '3': 'THU',
  '4': 'FRI',
  '5': 'SAT',
  '6': 'SUN',
  MON: 0,
  TUE: 1,
  WED: 2,
  THU: 3,
  FRI: 4,
  SAT: 5,
  SUN: 6
}

abbiamo un oggetto simile ad un array con valori sia con chiave numerica (0 : MON), sia con chiave di stringa (MON: 0). Possiamo quindi accedere ai dati sia in un modo che nell’altro, vediamo un esempio nel file ts

console.log(DAYS.SAT);

la restituzione è 5 (dallo 0 al 6 vengono numerati i 7 giorni della settimana). Qualora volessimo partire dall’1, basterebbe assegnarlo al primo valore.

MON = 1,

Qualora volessimo restituito il suo valore in stringa basta accedere al suo indice numerico

console.log(DAYS[1]);

Supponiamo di voler sapere i giorni lavorativi, creiamo una funzione

function isWorkingDay( day: DAYS) {
    if(day === DAYS.SUN || day === DAYS.SAT) {
        return true;
    }
    return false;
}

se proviamo sul giorno FRI riceveremo false

console.log(isWorkingDay(DAYS.FRI));

possiamo anche passare il giorno 3, ricevendo il risultato correttamente perchè corrisponde a WED

console.log(isWorkingDay(3));

se passassi un numero superiore al range, tipo 8, non riceverei errori, perchè l’array prevede l’inserimento di altri valori. Qualora aggiungessi un altro enum DAYS con altri valori, sovrascriverebbe quello precedente

enum DAYS { PIPPO, PAPERINO }

ora in DAYS avrei PIPPO in posizione 0 e Paperino in posizione 1, mentre in posizione 2 avrei TUE, qualora volessi aggiungere valori in sequenza dovrei stanziare il primo valore alla posizione numerica successiva

enum DAYS { PIPPO = 8, PAPERINO }

any, void, null, undefined, never

quando i dati non sono conosciuti, tipo quando arrivano da una chiamata AJAX, possiamo utilizzare il tipo any

let age: any = 45;
age = '45'; //nessun errore

esempio tipico di array cui membri sono di tipo any

let userData: any[] = [45, 'hippo', {indirizzo: 'Genova'}];

se dichiaro

userData = 4;

riceverei un errore perchè non è un array, mentre abbiamo dichiarato che è un ARRAY di tipo any. Il tipo array any è da utilizzare quando abbiamo dei dati all’interno con tipi differenti mischiati tra loro.

Un altro tipo che si può utilizzare è il tipo void (vuoto), utile per esempio in presenza di una funzione che non ritorna alcun dato

function printName() : void {
  return 4;
}

Genera errore perchè se dichiarata void la funzione può ritornare solo NULL o UNDEFINED.

A seconda della configurazione di TypeScript NULL  potrebbe non essere accettato in void, dipende se il parametro strictNullChecks nel file tsconfig.json è settato a true o false. Ha poco senso assegnare il tipo void ad una variabile.

Il tipo never è da utilizzarsi nel caso in cui una funzione non ritorna mai nulla, nessun valore, caso differente da void, null o undefined.

Null e undefined ha poco senso assegnarli

let myAge:null;
let myAge2:undefined;

In typescript è permesso per quanto insensato, a differenza di any e void.