TypeScript



Introduzione

Typescript rappresenta il tentativo di Microsoft di risolvere alcuni dei problemi che sono connaturati con Javascript. Il potente linguaggio di scripting ideato negli anni 90 da Brendan Eich per Netscape è uno degli strumenti principe sul Web ma, col tempo, sono emerse alcune criticità che la comunità degli sviluppatori Web, in buona parte, preferirebbe evitare. Non è il primo sforzo in questo senso: Google ha promosso l'interessante linguaggio Dart ad esempio, oppure potremmo parlare del noto Coffescript. Anche alcuni linguaggi compilano direttamente in Javascript: Fantom, ad esempio e anche Scala sta andando in quella direzione come i nuovi Kotlin e Ceylon. Il prodotto della casa di Redmond, alla cui nascita ha partecipato un nome del calbro di Anders Hejlsberg, padre di Delphi e di C#, si distingue perchè non propone un nuovo linguaggio, o meglio, un linguaggio completamente nuovo, che può compilare avendo Javascript come backend ma in realtà si propone di estendere Javascript stesso fornendogli dei costrutti (opzionali) che migliorano l'espressività e ancor di più la robustezza del linguaggio. Il compilatore alla fin fine genera pur sempre codice Javascript "normale" ma il processo per arrivare a questo risultato è comunque facilitato dal fatto che non ci si allontana dal linguaggio puro se non quando si sente la necessità di usare gli strumenti addizionali offerti. (Nota bene: so che questa impostazione fa venire lugubri pensieri legati alla celebre "strategia"definita dalla sigla EEE ma, in questo caso, non mi pare di ravvisare le medesime finalità paventate per il caso Java. Javascript non è un pericolo per MS e sono comunque altri tempi).
In effetti qualcuno ha osservato che è quasi inappropriato parlare di "nuovo linguaggio". Le estensioni offerte spariscono del tutto in fase di generazione del codice e aiutano soprattutto le fasi di rilevazione degli errori e di debugging. Tuttavia gli aspetti legati alla espressività e alla leggibilità, il fatto che seguendo le regole previste il linguaggio sia più rigido e meno disposto alla tolleranza di certi trucchi un po' sporchi sono fatti a mio avviso non secondari.

Per verificare quanto detto vediamo subito un esempio, preso dalla home page del progetto, che descrive chiaramente lo spirito di questo strumento:

  Esempio 1.1.a Esempio 1.1.b
1
2
3
4
5
6
7
function greeter(person) {
return "Hello, " + person;
}

var user = "Jane User";

document.body.innerHTML = greeter(user);
1
2
3
4
5
6
7
function greeter(person: string) {
return "Hello, " + person;
}

var user = "Jane User";

document.body.innerHTML = greeter(user);

Il codice contenuto nel riquadro 1.1.a è normale Javascript. Esso viene gestito perfettamente dal compilatore Typescript. Il codice del riquadro 1.1.b invece è codice Typescript e la differenza è costituita sostanzialmente da quel ": string" appicciato nella firma della funzione alla riga 1. Sembra poco ma è molto perchè, come si intuisce, questa, che è una type annotation, stabilisce il fatto che il parametro che deve essere passato alla funzione greeter può essere solo di tipo stringa. Se usiamo il codice 1.1.a potremmo passare anche un intero o un array. Se compiliamo il codice del lato 1.1.b invece la riga 5 può passare solo una stringa, diversamente ne risulta un errore. E' un esempio banale ma fa apparire chiaramente le finalità di questo approccio: rendere più stringente il modo in cui di scriviamo il nostro codice. Questo, sia chiaro, non è tutto come vedremo poco più avanti; ma fornisce, come detto, un quadro di come lavora Typescript e di quale filosofia gli sta dietro... Vale la pena sottolineare che il codice Javascript generato è identico nei due casi. Solo il livllo di controllo che si ha è diverso.

Rispetto a strumenti analoghi, come il già citato Dart, Typescript ha il vantaggio, oltre a quello di non allontanarsi dalla grammatica di Javascript, di poter lavorare con le numerose librerie esistenti per il linguaggio di Eich e questo è un aspetto parecchio importante. Inoltre non dovrete buttare via il vecchio codice ma potrete intergrarlo con il nuovo senza soverchie difficoltà.

Per allargare un po' il discorso, sia pure in modo sommario, evidenziamo ora le estensioni che questo strumento offre rispetto a Javascript. Abbiamo:
  • type checking in compilazione, come visto nell'esempio precedente
  • classi ed interfacce
  • programmazione modulare
  • funzioni lambda
C'è materiale interessante e, a quanto pare, c'è spazio anche per altro (generics?).

Ovviamente non può mancare il controcoro; cosa ci può essere di negativo in questo progetto? Prima di tutto dietro di esso c'è Microsoft. Volenti o nolenti il suo passato pesa come un macigno, le pratiche al limite della correttezza (eufemismo, lo so) della casa fondata da Bill Gates sono note a tutti e c'è sempre qualche sospetto quando propone qualcosa di nuovo. Un atteggiamento al limite del paranoico che a però a Redmond si sono un po' cercati. E' una questione molto generica ma già se ne parla sul Web. Andando più sul concreto c'è l'aspetto della reale utilità di tutto ciò. Chi ama Javascript lo fa perchè apprezza quello spirito un po' libertino che Typescript sembra voler tarpare in partenza. Chi non ama la sua sintassi invece potrebbe preferire quella non originalissima ma abbastanza chiara di Dart o quella più fresca e forse immediata, Ruby-like, di Coffeescript; o magari andare su altri prodotti ancora, come Haxe ecc... Inoltre allo stato attuale Typescript pare dia il suo meglio in termini di produttività in congiunzione con Visual Studio 2012 ed il suo Intellisense, anche se esistono plugin per altri editor come SublimeText. Insomma, il top lo si otterrebbe rimanendo nel mondo Windows. (Nota: personalmente sto facendo esperimenti usando Notepad nonostante abbia VS2012 installato... preferisco sempre iniziare da strumenti "deboli"). Se questi aspetti costituiscono un "major issue"  è una decisione che spetta al singolo.

Type script è offerto gratuitamente con licenza Apache.