INTRODUZIONE A
TYPESCRIPT
Marco Assandri
21 marzo 2013
Agenda
• Negli anni scorsi …
• Problematiche e soluzioni esistenti
• TypeScript - presentazione generale
• Tools
• Tipizzazione
• Inferenza
• Classi
• Funzioni
• Ereditarietà
• Moduli
• Integrazione librerie esterne
• Debug
• Links
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
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
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.
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
• Difficoltà ad utilizzare librerie non supportate
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/
TypeScript
• TypeScript aggiunge funzionalità a JavaScript
• possiamo prendere un codice Javascript esistente e
•
•
•
•
inserirlo in un file TypeScript (.ts) e viene riconosciuto
correttamente
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
Tools
• Per provarlo
http://www.typescriptlang.org/Playground/
• Per sviluppare seriamente
• Visual Studio Update 1
• ASP.NET and Web Tools 2012.2 (consigliato)
• 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)
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
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>
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');
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)
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;
}
}
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;
}
}
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;
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).
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._________
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);
Moduli interni
• I moduli possono essere estesi anche su file separati.
• È possibile referenziare moduli su file diversi usando la
sintassi
/// <reference path="nomefile.ts" />
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
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
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
Links
• http://www.typescriptlang.org/
• http://www.johnpapa.net/typescriptpost1/
Scarica

Introduzione a typescript - Torino Technologies Group