26
Introduzione a TypeScript Marco Assandri [email protected] www.dotnettoscana.org #jsfull

DotNetToscana - Sessione TypeScript

Embed Size (px)

Citation preview

Page 1: DotNetToscana - Sessione TypeScript

Introduzione a TypeScript

Marco Assandri

[email protected] www.dotnettoscana.org

#jsfull

Page 2: DotNetToscana - Sessione TypeScript

Thanks to our sponsor

Page 3: DotNetToscana - Sessione TypeScript

Agenda Negli anni scorsi …

Problematiche e soluzioni esistenti

TypeScript - presentazione generale

Tools

Tipizzazione

Inferenza

Classi

Funzioni

Ereditarietà

Moduli

Integrazione librerie esterne

Debug

Links

Page 4: DotNetToscana - Sessione TypeScript

Negli anni scorsi … ASP.NET Web-Forms (2002) • minore importanza al Javascript grazie ai controlli del framework • tendenza a spostare il lavoro sul server

2004-2005 inizia la moda AJAX (tecnologia già presente in IE5) con ampio utilizzo in Gmail e Google Maps • Microsoft rilascia controlli lato server anche per AJAX

jQuery (Agosto 2006) • Risolve molti problemi cross-browser e fornisce un’interfaccia comune • Semplifica la programmazione lato client

Firebug (2006 mi pare) => Developer Toolbar per Chrome e IE • Favoriscono moltissimo lo sviluppo e il debug di JS, CSS e HTML • Attivabili con F12

Page 5: DotNetToscana - Sessione TypeScript

Negli anni scorsi … HTML 5

• Ancora maggiore enfasi e strumenti per spostare il lavoro sul client

• Ecmascript 5 aggiunge nuove funzionalità a Javascript

• Possibilità di realizzare applicazioni web complesse e performanti http://www.cuttherope.ie/

Windows RT e Node.js

• Permettono di utilizzare Javascript lato server e per scrivere applicazioni per Windows Store

Page 6: DotNetToscana - Sessione TypeScript

Problematiche Javascript manca di alcune strutture a cui siamo abituati con C#

• Tipizzazione

• Interfacce

• Classi

• Namespace

Alcuni comportamenti del linguaggio sono diversi da quello che potremmo aspettarci in quanto sviluppatori .NET (this, assegnazione variabili, funzioni che rappresentano oggetti, closures, …)

Risulta indubbiamente complesso gestire applicazioni di grandi dimensioni.

Page 7: DotNetToscana - Sessione TypeScript

Soluzioni tentate Negli anni si sono sviluppate Best Practice per la strutturazione del codice Javascript che simulano le funzionalità mancanti • Prototype pattern • Module pattern • Revealing module pattern • Revealing prototype pattern

Script # • Permette la scrittura di codice in C# che viene compilato in Javascript • Scarsa documentazione • Difficoltà ad utilizzare librerie non supportate

Coffee Script • Necessità di imparare una nuova sintassi • È soggetto a cambiamenti di sintassi, problemi nel debugging e nella comprensione degli

errori di compilazione

Page 8: DotNetToscana - Sessione TypeScript

TypeScript

“TypeScript is a language for application-scale JavaScript development.

TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.

Any browser. Any host. Any OS. Open Source.”

Definizione presa da http://www.typescriptlang.org/

Page 9: DotNetToscana - Sessione TypeScript

TypeScript • TypeScript aggiunge funzionalità a JavaScript (sostanzialmente aggiunge la tipizzazione statica e il modello di programmazione ad oggetti class-based)

• Le funzionalità aggiuntive sono implementate seguendo le specifiche ES6

• Il codice viene compilato in JavaScript (ES3 o ES5) e il compilatore trasforma le funzionalità aggiuntive seguendo i pattern più comuni

• Il codice risulta più pulito, leggibile, con supporto di intellisense e errori a compile time

• possiamo prendere un codice Javascript esistente e inserirlo in un file TypeScript (.ts) e viene riconosciuto correttamente

Page 10: DotNetToscana - Sessione TypeScript

Tools - Per provarlo http://www.typescriptlang.org/Playground/

- Per sviluppare seriamente Visual Studio Update 2 (include ASP.NET and Web Tools 2012.2)

Plugin per Visual Studio 2012 http://www.microsoft.com/en-us/download/details.aspx?id=34790

Web Essentials 2012 (consigliato)

(DEMO)

- Altri (Sublime Text, EMACS, Vim, Node.js, …)

- Self hosting (typescript.js)

Page 11: DotNetToscana - Sessione TypeScript

Tipizzazione • Javascript è un linguaggio senza tipizzazione statica => errori rilevati a runtime

• TypeScript permette la tipizzazione tramite una sintassi opzionale il :

var a; // tipo any

var b: number; // tipo number

• => Intellisense migliorato e errori a compile time

• Possibilità di usare tipi opzionali usando ?

• (DEMO)

Page 12: DotNetToscana - Sessione TypeScript

Type inference • Type inference: il compilatore riesce in molti casi a dedurre il tipo di variabile quando non viene dichiarato espressamente.

• Possibile il casting tramite <nometipo>

var par = <HTMLParagraphElement>document.getElementById('p1');

Page 13: DotNetToscana - Sessione TypeScript

Classi È possibile creare classi con campi, proprietà, costruttori e funzioni

class Car {

// Property (public by default)

engine: string;

// Constructor

// (accepts a value so you can initialize engine) constructor(engine: string) {

this.engine = engine;

}

}

var hondaAccord = new Car('V6');

Page 14: DotNetToscana - Sessione TypeScript

Funzioni • Arrow functions => : è un modo alternativo per definire le funzioni e risolve il problema dello scope del this

• Pianificato in ES6 var myFunc1 = function (h: number, w: number) { return h * w; }; può essere scritto come var myFunc2 = (h: number, w: number) => h * w; Le seguenti sono equivalenti (x) => { return Math.sin(x); } (x) => Math.sin(x) x => { return Math.sin(x); } x => Math.sin(x)

Page 15: DotNetToscana - Sessione TypeScript

Funzioni Le funzioni all’interno delle classi possono essere implementate come prototype o come istanze

class Car { engine: string; stop: () => string;

constructor (engine: string) { this.engine = engine; this.stop = () => "Stopped " + this.engine; }

start() { return "Started " + this.engine; }

}

Page 16: DotNetToscana - Sessione TypeScript

Ereditarietà TypeScript semplifica l’ereditarietà usando extends che permette l’accesso ai membri pubblici e al costruttore. Il costruttore può essere ridefinito e per chiamare il costruttore della classe base usiamo super

class Auto {

engine: string; constructor(engine: string) { this.engine = engine; }

}

class ManlyTruck extends Auto {

bigTires: bool; constructor(engine: string, bigTires: bool) { super(engine); this.bigTires = bigTires; }

}

Page 17: DotNetToscana - Sessione TypeScript

Interfacce TypeScript permette di definire tipi complessi sotto forma di interfacce.

interface ICar{ engine: string; color: string; }

class Car implements ICar { constructor (public engine: string, public color: string) {

} }

var toyotaCamry : ICar;

Page 18: DotNetToscana - Sessione TypeScript

Moduli • I moduli in TypeScript (paragonabili ai namespace in C#) permettono una migliore scrittura del codice favorendone il riuso, l’incapsulamento, lo separano dal global scope ed è supportato AMD e commonJS.

• I moduli possono essere interni o esterni (utili per AMD).

Page 19: DotNetToscana - Sessione TypeScript

Moduli interni • I moduli interni vengono creati tramite module

• Il contenuto del modulo vive in esso ed è esterno dal global scope

• I moduli possono essere nested.

module Shapes { class Rectangle {

constructor ( public height: number, public width: number) { }

}

// This works! var rect1 = new Rectangle(10, 4);

}

// This won't!! var rect2 = Shapes._________

Page 20: DotNetToscana - Sessione TypeScript

Moduli interni • Per farlo funzionare si usa export

module Shapes { export class Rectangle { constructor ( public height: number, public width: number) { } } } // This works! var rect = Shapes.Rectangle(10, 4);

Page 21: DotNetToscana - Sessione TypeScript

Moduli interni • I moduli possono essere estesi anche su file separati.

• È possibile referenziare moduli su file diversi usando la sintassi

/// <reference path="nomefile.ts" />

Page 22: DotNetToscana - Sessione TypeScript

Moduli esterni • Per facilitare la gestione delle dipendenze in progetti complessi si tende ad utilizzare AMD e require.js. TypeScript lo supporta tramite i moduli esterni.

• Invece della keyword module si scrive direttamente ogni modulo in un file separato e tramite import e export si mettono in relazione

Page 23: DotNetToscana - Sessione TypeScript

Integrazione librerie • Per utilizzare librerie esterne conviene utilizzare i definition files (estensione .d.ts) per sfruttare al meglio la tipizzazione e l’intellisense.

• I definition files disponibili possono essere scaricati da https://github.com/borisyankov/DefinitelyTyped

• In mancanza usare solo declare

Page 24: DotNetToscana - Sessione TypeScript

Debugging • Oltre a debuggare il javascript generato è possibile inserire breakpoint direttamente in TypeScript

• Passi da seguire:

Visual Studio 2012

Abilitazione dei file di mapping su Web Essentials

Utilizzo di Internet Explorer 9 o 10

Page 26: DotNetToscana - Sessione TypeScript

Tutto il materiale di questa sessione su

Grazie!

#jsfull

http://www.dotnettoscana.org/javascript-full-immersion.aspx