{"id":12310,"date":"2017-03-17T14:38:30","date_gmt":"2017-03-17T13:38:30","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=12310"},"modified":"2017-03-17T14:38:30","modified_gmt":"2017-03-17T13:38:30","slug":"introduzione-a-typescript","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/introduzione-a-typescript\/","title":{"rendered":"Introduzione a TypeScript"},"content":{"rendered":"<p>Javascript viene considerato da tantissimi sviluppatori\u00a0un linguaggio completo, veloce da apprendere e altamente produttivo tanto che i suoi pi\u00f9 accaniti appassionati hanno dimostrato spesso evidente avversione nei confronti delle alternative\u00a0pi\u00f9 classiche come Java, C++ e C# che, sebbene ricche di funzionalit\u00e0 e orientate agli oggetti, hanno dimostrato spesso una prolissit\u00e0 eccessiva. Inoltre, la nascita di una piattaforma come <a href=\"http:\/\/www.devapp.it\/wordpress\/introduzione-a-node-js\/\" target=\"_blank\">Node.js<\/a> \u00a0e di tutto ci\u00f2 che ne \u00e8 derivato &#8211; tra cui l&#8217;impiego di tecnologie web in campo\u00a0mobile &#8211; hanno\u00a0spinto Javascript verso record storici di utilizzo.<\/p>\n<p>Tuttavia, l&#8217;essenzialit\u00e0 di questo linguaggio ha fatto sentire la mancanza, nel tempo, di alcuni meccanismi sintattici &#8211; uno su tutti, il controllo dei tipi di dato &#8211; e ci\u00f2 ha portato via via\u00a0alla definizione del linguaggio di cui iniziamo a parlare oggi, <a href=\"http:\/\/www.typescriptlang.org\/\" target=\"_blank\">Typescript<\/a>, figlio dei laboratori di ricerca Microsoft.<\/p>\n<h2>Avvio a TypeScript<\/h2>\n<p>Iniziamo innanzitutto a metterlo a disposizione della nostra piattaforma e per farlo abbiamo bisogno del package manager <em>npm\u00a0<\/em>di cui si \u00e8 gi\u00e0 parlato a proposito di Node.js:<\/p>\n<pre class=\"lang:sh decode:true\">$ npm install -g typescript<\/pre>\n<p>La prima nozione da apprendere \u00e8 che, a differenza di Javascript, ci troviamo di fronte ad un<strong> linguaggio compilato<\/strong>, non interpretato. L&#8217;attivazione del compilatore avviene tramite il comando <em>tsc<\/em> che ora, dopo l&#8217;invocazione precedente, avremo a disposizione nel nostro sistema. La compilazione generer\u00e0 dei file Javascript che useremo nelle pagine web che stiamo producendo. Si ricordi comunque che <strong>qualsiasi codice Javascript \u00a0\u00e8 anche codice TypeScript valido<\/strong> e questo permette un passaggio graduale al nuovo formalismo.<\/p>\n<p>Scriviamo il nostro primo codice TypeScript:<\/p>\n<pre class=\"lang:js decode:true \">var messaggio: string=\"Ciao mondo!\";\r\nalert(messaggio);<\/pre>\n<p>Si tratta di un normale codice Javascript (che avremo salvato nel file<strong> prova.ts<\/strong>) che non si occupa altro se non della pubblicazione di un semplice messaggio di benvenuto in una finestra di alert. Unica differenza rispetto a ci\u00f2 che siamo abituati a vedere \u00e8 quella notazione &#8220;<em>:string<\/em>&#8221; che segue il nome della variabile. Quello \u00e8 il tipo di dato che assegniamo al valore ed \u00e8 uno dei tratti pi\u00f9 distintivi di TypeScript.<\/p>\n<p><strong>Compiliamo<\/strong> il file con il comando:<\/p>\n<pre class=\"lang:objc decode:true \">$ tsc prova.ts<\/pre>\n<p>ed otteniamo nella medesima cartella il file <strong>prova.js<\/strong> dal contenuto identico al precedente ad esclusione della specifica del tipo di dato <em>string<\/em> per la variabile messaggio:<\/p>\n<pre class=\"lang:js decode:true \">var messaggio = \"Ciao mondo!\";\r\nalert(messaggio);<\/pre>\n<p>Per sperimentarlo, sar\u00e0 sufficiente creare un normale schema HTML in cui attivare lo script:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;html&gt;\r\n&lt;head&gt;\r\n&lt;script src=\"prova.js\"&gt;&lt;\/script&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>Ogni volta che viene modificato, lo script TypeScript deve essere ricompilato o in alternativa si pu\u00f2 scegliere un meccanismo automatico tramite l&#8217;opzione<em> &#8211;watch<\/em><\/p>\n<pre class=\"lang:sh decode:true\">$ tsc prova.ts --watch<\/pre>\n<p>il quale lascer\u00e0 il processo in esecuzione e, ogni volta che percepir\u00e0 modifiche al codice, proceder\u00e0 alla ricompilazione avvisandoci con log di questo tipo sulla console:<\/p>\n<pre class=\"lang:sh decode:true\">14:18:51 - Compilation complete. Watching for file changes.\r\n14:19:03 - File change detected. Starting incremental compilation...\r\n14:19:04 - Compilation complete. Watching for file changes.<\/pre>\n<p>La compilazione del codice TypeScript previene anche da\u00a0errori che, con un linguaggio interpretato, noteremmo solo in produzione o, peggio ancora, produrrebbero dei comportamenti inaspettati. Poniamo il caso di aggiungere una riga al codice con un&#8217;operazione insensata\u00a0per una stringa:<\/p>\n<pre class=\"lang:sh decode:true \">var messaggio: string=\"Ciao mondo bellissimo!\";\r\nmessaggio*=2;\r\nalert(messaggio);<\/pre>\n<p>la compilazione con <em>tsc\u00a0<\/em>produce\u00a0il seguente errore<\/p>\n<pre class=\"lang:sh decode:true\">prova.ts(2,1): error TS2362: The left-hand \r\nside of an arithmetic operation must be of type 'any', \r\n'number' or an enum type.<\/pre>\n<p>mentre Javascript accetterebbe il tutto e produrrebbe in risposta\u00a0un valore NaN (Not a Number) all&#8217;interno dell&#8217;alert.<\/p>\n<h2>Tipi di dato e interfacce<\/h2>\n<p><strong>La tipizzazione dei dati in TypeScript \u00e8 opzionale<\/strong> ma se ne consiglia fortemente l&#8217;uso. I tipi adottabili sono i seguenti:<\/p>\n<ul>\n<li><strong>number<\/strong> per tutti i numeri, senza distinzioni;<\/li>\n<li><strong>string<\/strong>, come immaginabile, per le stringhe quindi ogni tipo di sequenza alfanumerica;<\/li>\n<li><strong>boolean<\/strong> per conservare valori logici corrispondenti al concetto di <em>true<\/em> o <em>false<\/em>, rispettivamente, vero o falso;<\/li>\n<li><strong>tuple<\/strong> che consistono in array in cui gli elementi avranno tipi di dato differenti ma prestabiliti. Ad esempio, la seguente tupla:\n<pre class=\"lang:js decode:true \">var tupla:[string, boolean, number]=[\"messaggio di testo\", true, 23];<\/pre>\n<p>vedr\u00e0, al suo interno, la componente tupla[0] che accetter\u00e0 solo stringhe, tupla[1] che vorr\u00e0 solo un valore booleano ed infine tupla[2] in grado di immagazzinare solo numeri. Inoltre, le tuple non hanno dimensione fissa ma si possono aggiungere ulteriori elementi dopo quelli dichiarati;<\/li>\n<li>le <strong>enumerazioni<\/strong> permettono, come in altri linguaggi, di definire tipi di dato il cui dominio di esistenza \u00e8 limitato a specifici valori. Ad esempio:\n<pre class=\"lang:js decode:true \">enum Semaforo {Rosso, Verde, Giallo};<\/pre>\n<p>permetter\u00e0 di usare i tre nuovi valori Semaforo.Rosso, Semaforo.Verde e Semaforo.Giallo;<\/li>\n<li><strong>any<\/strong> accetta qualsiasi valore all&#8217;interno della variabile: attua in pratica quello che \u00e8 il comportamento tipico di Javascript;<\/li>\n<li><strong>void<\/strong>, in ultimo, viene per lo pi\u00f9 utilizzato come tipo di ritorno per le funzioni ad indicare la loro natura di &#8220;procedure&#8221;, non offrendo quindi alcun risultato ma svolgendo solo operazioni.<\/li>\n<\/ul>\n<p>Di questi tipi di dato, i primi tre coincidono esattamente con quelli offerti da Javascript classico, gli altri sono stati appositamente introdotti in TypeScript.<\/p>\n<p>Inoltre, si pu\u00f2 definire dei nuovi tipi di dato aggregati indicando quali componenti devono farne parte. Se, ad esempio,\u00a0volessimo definire un tipo di oggetto in grado di rappresentare una persona con tanto di nome, cognome, et\u00e0 e possesso di un&#8217;automobile potremmo utilizzare la seguente <strong>interfaccia<\/strong>:<\/p>\n<pre class=\"lang:js decode:true\">interface Persona\r\n{\r\n\tnome: string;\r\n\tcognome: string;\r\n\teta: number;\r\n\tautomunito: boolean\r\n}\r\n<\/pre>\n<p>per definire oggetti di questo tipo:<\/p>\n<pre class=\"lang:js decode:true\">var tizio:Persona ={\r\n\tnome: \"Gigi\",\r\n\tcognome: \"Rossi\",\r\n\teta: 45,\r\n\tautomunito: true\r\n}<\/pre>\n<p>o da passare come parametri formali a funzioni del genere:<\/p>\n<pre class=\"lang:js decode:true\">function salvaPersona(p: Persona)\r\n{\r\n     \/\/ codice da eseguire\r\n}<\/pre>\n<h2>Conclusioni<\/h2>\n<p>TypeScript \u00e8 nato quindi come evoluzione del linguaggio Javascript in modo da\u00a0rispondere a maggiori esigenze di sicurezza senza rinunciare ai vantaggi del suo progenitore. Dimostrazione\u00a0del suo valore\u00a0\u00e8 anche l&#8217;utilizzo che ne \u00e8 stato fatto\u00a0nei pi\u00f9 recenti framework\u00a0Javascript: uno su tutti Angular2. Per chi volesse iniziare a sperimentare il linguaggio senza dover necessariamente installarlo sulla propria macchina, si pu\u00f2 ricorrere a <a href=\"http:\/\/www.typescriptlang.org\/play\/\" target=\"_blank\">Playground<\/a>, la\u00a0console messa a disposizione sul sito ufficiale: presenta\u00a0due pannelli in cui potremo scrivere il codice TypeScript e vederlo compilato.<\/p>\n<p>Questo \u00e8 solo l&#8217;inizio di quanto vi racconteremo su questa nuova frontiera del web: continuate a seguirci!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Javascript viene considerato da tantissimi sviluppatori\u00a0un linguaggio completo, veloce da apprendere e altamente produttivo tanto che i&#8230;<\/p>\n","protected":false},"author":561,"featured_media":12893,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1538,1537,1539,1753,1727],"class_list":["post-12310","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-javascript","tag-node-js","tag-npm","tag-typescript","tag-typescript-web-developement"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=12310"}],"version-history":[{"count":8,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12310\/revisions"}],"predecessor-version":[{"id":13609,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12310\/revisions\/13609"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/12893"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=12310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=12310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=12310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}