Angular 4
ES6 & TypeScript
in collaborazione conES6 & TypeScript
COS'È TYPESCRIPT?
2
in collaborazione conES6 & TypeScript
TypeScript è un super-set di
JavaScript, OpenSource, realizzato e
mantenuto da Microsoft.
Estende la sintassi di JavaScript,
rendendo la sua adozione più
immediata e veloce.
3
in collaborazione conES6 & TypeScript
PERCHÉ TYPESCRIPT?
4
in collaborazione conES6 & TypeScript
✴TypeScript è stato ideato per realizzare Web Applications su larga
scala, in modo da rendere più facile il mantenimento del codice;
✴La pre-compilazione e i costrutti introdotti da TypeScript rendono il
codice più espressivo, riducendo il numero degli errori in fase di
stesura;
✴Permette già da subito di utilizzare buona parte delle novità
introdotte con ES6 senza sacrificare il supporto a browser più
datati.
5
in collaborazione conES6 & TypeScript
✴TypeScript è completamente slegato da Angular. Anche se è
possibile scrivere un'applicazione Angular utilizzando JavaScript, il
framework stesso è scritto in TypeScript. Inoltre, la complessità di
Angular rende TypeScript una tecnologia quasi necessaria.
✴Essendo slegato da qualsiasi contesto, è possibile utilizzare
TypeScript per qualsiasi progetto JavaScript (e consiglio di farlo).
6
in collaborazione conES6 & TypeScript
PRINCIPALI VANTAGGI
7
in collaborazione conES6 & TypeScript
✴TypeScript previene gli errori a compile-time;
✴Introducendo i tipi, permette di avere più controllo, rendendo il
codice autoesplicativo e mantenibile prevenendo, di nuovo, gli
errori;
✴Tutto il codice ES6 può venir convertito in codice ES5 al momento
della compilazione in modo trasparente e sicuro.
8
in collaborazione conES6 & TypeScript
this
class
let
const
() => { }
map
forEach
(a = 10) { }
[…params]
`Awesome string ${interpolation}`{ x, y }
export
import
extends
Symbol
Typed Arrays
Promise
ES6
(…b) { }
9
1.
LISTA DELLA SPESA
in collaborazione conES6 & TypeScript 10
in collaborazione conES6 & TypeScript
WebStorm
https://www.jetbrains.com/webstorm/
11
in collaborazione conES6 & TypeScript
Visual Studio

Code
https://code.visualstudio.com/
12
...consiglio però vivamente WebStorm!!!
Introduzione ad ES6
Le principali novità
in collaborazione conES6 & TypeScript
Molte delle novità introdotte con ES6
sono delle shortcuts rispetto ad ES5,
andando a semplificare il lavoro degli
sviluppatori.
Per maggiori informazioni

http://es6-features.org/
14
1.
VARIABILI
in collaborazione conES6 & TypeScript 15
in collaborazione conES6 & TypeScript
Assieme a var, è stata creata let,
variabile di tipo block-scoped.
16
var a = 1;
var b = 2;
if(a > b){
let c = 3;
}
console.log(c);
// ReferenceError
in collaborazione conES6 & TypeScript
È stato introdotto anche l'uso delle
costanti con const
17
const PI = 3.14;
console.log(PI);
// 3.14
PI = 2;
// invalid assignment to const 'PI'
2.
FUNZIONI
in collaborazione conES6 & TypeScript 18
in collaborazione conES6 & TypeScript
Vengono introdotte le Arrow Functions, un modo per definire
una funzione in modo più semplice.
Grazie a questo costrutto viene anche risolto il problema di this
all'interno degli oggetti.
19
in collaborazione conES6 & TypeScript 20
var log = function(msg) {
console.log(msg);
}
var log = msg => console.log(msg);
in collaborazione conES6 & TypeScript 21
var c = {
name: 'Pippo',
greet: function(){
var setName = (newName) => this.name = newName;
setName('Pluto');
}
}
in collaborazione conES6 & TypeScript
Grazie ai default parameters, è possibile valorizzare un parametro
in ingresso di una funzione senza la necessità di definirlo al
momento dell'utilizzo della funzione stessa.
22
in collaborazione conES6 & TypeScript 23
var log = function(msg = 'This is a message') {
console.log(msg);
}
log();
in collaborazione conES6 & TypeScript
È possibile passare n parametri in ingresso ad una funzione
grazie allo spread operator.
24
in collaborazione conES6 & TypeScript 25
var log = function(msg, ...other) {
const otherString = other.join(' ');
console.log(msg + ' ' + otherString);
}
log('This is a message', 'a', 'b', 3);
3.
STRINGHE
in collaborazione conES6 & TypeScript 26
in collaborazione conES6 & TypeScript
Grazie a string interpolation, è possibile formattare una stringa,
senza ricorrere alla concatenazione classica, utilizzando il
simbolo `` (back-tick).
Vengono mantenuti anche spazi, tabulazioni e a capo.
27
in collaborazione conES6 & TypeScript 28
let a = 'This is';
let b = 'a message.';
console.log(`${a} ${b}`);
let a = 'This is';
let b = 'a message.';
console.log(`
${a}
${b}
`);
4.
ARRAY
in collaborazione conES6 & TypeScript 29
in collaborazione conES6 & TypeScript
È possibile concatenare più array grazie allo spread operator.
30
in collaborazione conES6 & TypeScript 31
let a = [1, 2, 3];
let b = [4, 5, 6];
console.log([...a, ...b]);
console.log([...b, ...a]);
in collaborazione conES6 & TypeScript
Grazie al destructuring è possibile mappare, valore per valore, gli
elementi di un array*.
32
* utilizzabile anche su oggetti.
in collaborazione conES6 & TypeScript 33
const a = ['Pippo', 'Pluto'];
let [firstname, lastname] = a;
console.log(firstname);
console.log(lastname);
in collaborazione conES6 & TypeScript 34
const a = ['Pippo', 'Pluto', 'Paperino'];
let [firstname, , lastname] = a;
console.log(firstname);
console.log(lastname);
5.
CLASSI
in collaborazione conES6 & TypeScript 35
in collaborazione conES6 & TypeScript
Le classi in ES6 rappresentano un modo veloce per utilizzare le
funzioni come function constructor.
36
in collaborazione conES6 & TypeScript 37
class Person = {
constructor(firstName, lastName){
this.firstName = firstName;
this.lastName = lastName;
}
sayHi(){
return `Hi ${this.firstName}`;
}
}
var pippo = new Person(‘Pippo’, ‘Pluto’);
console.log(pippo.sayHi());
in collaborazione conES6 & TypeScript 38
var Person = (function () {
function Person(firstname, lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
Person.prototype.sayHi = function () {
return "Hi " + this.firstname + "!";
};
return Person;
}());
var pippo = new Person(‘Pippo’, ‘Pluto’);
console.log(pippo.sayHi());
in collaborazione conES6 & TypeScript
Per avere maggiore controllo sulle proprietà della classe, è
possibile implementare getter e setter.
39
in collaborazione conES6 & TypeScript 40
class Person = {
constructor(firstName, lastName){
this._firstname = firstname;
}
get firstname() {
return this._firstname;
}
set firstname(value) {
if (this._firstname.length === 0) {
this._firstname = value;
} else {
console.log('You cannot change the name!');
}
}
}
var pippo = new Person(‘Pippo’, ‘Pluto’);
console.log(pippo.firstname);
pippo.firstname = 'Paperino';
in collaborazione conES6 & TypeScript
È possibile estendere le classi (principio di ereditarietà).
41
in collaborazione conES6 & TypeScript 42
class BaseLog {
constructor(){
this._logName = 'Log 1';
}
log(msg){
console.log(msg);
}
}
class Logger extends BaseLog {
constructor(logName){
super(logName);
}
writeLine(msg){
super.log(`${msg}rn#`);
}
}
var logger = new Logger(‘Test’);
logger.log('This is a log');
logger.writeLine('This is another log');
6.
MODULES
in collaborazione conES6 & TypeScript 43
in collaborazione conES6 & TypeScript
Con ES6 è stata aggiunta la possibilità di creare dei moduli da
poter esportare ed importare a seconda delle esigenze.
Allo stato attuale, per poter utilizzare questa feature è necessario
un module loader come CommonJS o AMD.
Grazie ad Angular CLI (e Webpack), questa feature è già attiva e
funzionante in un nuovo progetto Angular.
44
in collaborazione conES6 & TypeScript 45
// customer.js
export let name = 'James';
export let city = 'Chandler';
// main.js
import { name, city } from './customer';
console.log(name);
console.log(city);
// main2.js
import * as customer from './customer';
console.log(customer.name);
console.log(customer.city);
7.
MAPS &
SETS
in collaborazione conES6 & TypeScript 46
in collaborazione conES6 & TypeScript
Con Map e Set è possibile collezionare e salvare dei dati.
Map può salvare una collezione di coppie chiave/valore (la chiave
deve essere univoca).
47
in collaborazione conES6 & TypeScript 48
const map = new Map();
// set items
map.set('Pippo', 'Pluto');
map.set('One', 'Item');
// duplicate index, ignored
map.set('Pippo', 'Pluto');
// get size of map
console.log(map.size);
// get an item
console.log(map.get('Pippo'));
// check if item exists
console.log(map.has('Pippo'));
// delete an item
map.delete('One');
// clear list
map.clear();
in collaborazione conES6 & TypeScript
Set può salvare una collezione di valori (il valore deve essere
univoco).
49
in collaborazione conES6 & TypeScript 50
const set = new Set();
// add items
set.add('Pippo');
set.add('Pluto');
// duplicate value, ignored
set.add('Pippo');
// get size of set
console.log(set.size);
// check if item exists
console.log(set.has('Pippo'));
// delete an item
set.delete('Pluto');
// clear list
set.clear();
TypeScript
Utilizzare ES6 potenziato
in collaborazione conES6 & TypeScript
Tutte le feature di ES6 finora viste possono essere utilizzare fin da
subito con TypeScript, permettendo, inoltre, la compatibilità con
sistemi più datati*.
52
* Non tutte le possibilità di ES6 vengono supportate e convertite da TypeScript: https://kangax.github.io/compat-table/es6/
1.
LISTA DELLA SPESA
in collaborazione conES6 & TypeScript 53
in collaborazione conES6 & TypeScript
TypeScript
npm install -g typescript
https://www.typescriptlang.org/
54
in collaborazione conES6 & TypeScript
COME FUNZIONA
TYPESCRIPT?
55
in collaborazione conES6 & TypeScript
TypeScript, tecnicamente, è un transpiler, ossia "converte" il
linguaggio con cui stiamo scrivendo (typescript) in un altro
linguaggio (javascript).
Poiché TypeScript è un superset di JavaScript, l'unico linguaggio
utilizzato è JavaScript stesso, potenziato con alcune possibilità
offerte da TypeScript.
56
2.
TIPIZZAZIONE
in collaborazione conES6 & TypeScript 57
in collaborazione conES6 & TypeScript
È possibile tipizzare una variabile
assegnando un tipo di dato
58
let a: number = 1;
let b: string = 'This is a string';
let c: boolean = true;
let d: undefined;
let e: null = null;
in collaborazione conES6 & TypeScript 59
let a: number = 1;
La definizione del tipo è assolutamente opzionale.
Tuttavia, definire il tipo di dato previene gli errori e
permette ad IDE ed editor predisposti di aiutare lo
sviluppatore con suggerimenti di completamento.
in collaborazione conES6 & TypeScript
I tipi di dato possono essere aggiunti
anche a funzioni, sia per i parametri
d'ingresso, che per il valore di ritorno
60
function sum(a: number, b: number): number { }
function log(msg: string): void { }
Il tipo void indica che non ci sono
valori di ritorno.
in collaborazione conES6 & TypeScript
Esiste un tipo particolare introdotto da TypeScript,
cioè any, il quale permette di salvare qualsiasi tipo
di dato (e di modificarlo nel tempo).
61
const somethingSpecial: any;
È sempre buona norma usare meno any possibili!
in collaborazione conES6 & TypeScript
Per gli array (od oggetti in generale), è possibile
utilizzare due scritture diverse.
62
let d: number[] = [1, 2, 3];
let c: Array<number> = [1, 2, 3];
Il risultato sarà il medesimo, ma la seconda
definizione utilizza i generics per segnare che l'array
potrà contenere solo numeri.
3.
INTERFACES
in collaborazione conES6 & TypeScript 63
in collaborazione conES6 & TypeScript 64
Oltre ai tipi di dato primitivi, TypeScript permette di creare dei
modelli di dati personalizzati, chiamati interfaces, con i quali
poter avere controllo sulle strutture dati complesse.
in collaborazione conES6 & TypeScript 65
interface IPerson {
firstname: string;
lastname: string;
age: number;
}
Le interfacce rappresentano un contratto (una firma) da
applicare alle variabili. Anche se lo ricordano, non sono oggetti
JavaScript.
in collaborazione conES6 & TypeScript 66
interface IPerson {
firstname: string;
lastname: string;
age: number;
}
let pippo: IPerson = {
firstname: 'Pippo',
lastname: 'Pluto',
age: 33
}
in collaborazione conES6 & TypeScript 67
interface IPerson {
firstname: string;
lastname: string;
age: number;
weight?: number;
}
Alcuni elementi di una interfaccia possono essere opzionali
in collaborazione conES6 & TypeScript 68
class AppComponent implements OnInit {
ngOnInit() { }
}
Le interfacce, inoltre, possono venir implementate all'interno di
una classe mediante la direttiva implements.
interface OnInit {
ngOnInit(): void;
}
4.
GENERICS
in collaborazione conES6 & TypeScript 69
in collaborazione conES6 & TypeScript 70
Lo scopo principale di uno sviluppatore non è solo quello di
creare componenti con API ben definite, ma che si possano
anche riutilizzare.
In linguaggi come C# o Java esiste il concetto di generics, un
componente che possa essere utilizzato con una varietà di tipi di
dato, invece che con uno soltanto.
in collaborazione conES6 & TypeScript 71
function identity(arg: number): number {
return arg;
}
Prendiamo come esempio una funzione che, dato un parametro
in ingresso, ne ritorna lo stesso valore.
Se volessimo far si che il tipo dell'argomento e il ritorno della
funzione sia diverso per ogni tipo di dato, dovremmo creare n
funzioni, una per ogni tipo.
in collaborazione conES6 & TypeScript 72
function identity(arg: any): any {
return arg;
}
Potremmo utilizzare any per definire un valore generico (any, di
per sé, è un tipo generico).
Ma, in questo modo, perdiamo tutte le informazioni e le
possibilità che ci offre TypeScript.
in collaborazione conES6 & TypeScript 73
function identity<T>(arg: T): T {
return arg;
}
console.log(identity<number>(10));
console.log(identity<string>('A string'));
Modificando la funzione impostandola con un generic, invece,
facciamo si che sia lo sviluppatore a scegliere il tipo di dato
corretto da utilizzare di volta in volta.
T è solo un placeholder ed una convenzione. Può essere utilizzata qualsiasi altra lettera.
5.
TYPE DEFINITION FILES
in collaborazione conES6 & TypeScript 74
in collaborazione conES6 & TypeScript 75
Finché utilizziamo i tipi di dato inclusi e gestiti da TypeScript,
possiamo trarre beneficio da tutte le sue feature.
Ma se volessimo utilizzare una libreria esterna, come ad esempio
jQuery, con TypeScript?
in collaborazione conES6 & TypeScript 76
$('#app').css('background-color', 'red');
error TS2304: Cannot find name '$'.
in collaborazione conES6 & TypeScript 77
Per risolvere questo problema, TypeScript mette a disposizione la
possibilità di creare un particolare file (.d.ts) al cui interno ci
sono le definizioni dei tipi di dato.
in collaborazione conES6 & TypeScript 78
Definitely Typed
http://definitelytyped.org/
in collaborazione conES6 & TypeScript 79
Typings
npm install -g typings
typings install --global dt~jquery --save
Typings è deprecato dall'uscita di TypeScript 2.0
in collaborazione conES6 & TypeScript 80
@types
npm install --save-dev @types/jquery
Dalla versione 2.0 di TypeScript
in collaborazione conES6 & TypeScript
© 2017 - Giovanni Buffa
81

Introduzione ad ECMAScript 6 (ES6) e TypeScript

  • 1.
    Angular 4 ES6 &TypeScript
  • 2.
    in collaborazione conES6& TypeScript COS'È TYPESCRIPT? 2
  • 3.
    in collaborazione conES6& TypeScript TypeScript è un super-set di JavaScript, OpenSource, realizzato e mantenuto da Microsoft. Estende la sintassi di JavaScript, rendendo la sua adozione più immediata e veloce. 3
  • 4.
    in collaborazione conES6& TypeScript PERCHÉ TYPESCRIPT? 4
  • 5.
    in collaborazione conES6& TypeScript ✴TypeScript è stato ideato per realizzare Web Applications su larga scala, in modo da rendere più facile il mantenimento del codice; ✴La pre-compilazione e i costrutti introdotti da TypeScript rendono il codice più espressivo, riducendo il numero degli errori in fase di stesura; ✴Permette già da subito di utilizzare buona parte delle novità introdotte con ES6 senza sacrificare il supporto a browser più datati. 5
  • 6.
    in collaborazione conES6& TypeScript ✴TypeScript è completamente slegato da Angular. Anche se è possibile scrivere un'applicazione Angular utilizzando JavaScript, il framework stesso è scritto in TypeScript. Inoltre, la complessità di Angular rende TypeScript una tecnologia quasi necessaria. ✴Essendo slegato da qualsiasi contesto, è possibile utilizzare TypeScript per qualsiasi progetto JavaScript (e consiglio di farlo). 6
  • 7.
    in collaborazione conES6& TypeScript PRINCIPALI VANTAGGI 7
  • 8.
    in collaborazione conES6& TypeScript ✴TypeScript previene gli errori a compile-time; ✴Introducendo i tipi, permette di avere più controllo, rendendo il codice autoesplicativo e mantenibile prevenendo, di nuovo, gli errori; ✴Tutto il codice ES6 può venir convertito in codice ES5 al momento della compilazione in modo trasparente e sicuro. 8
  • 9.
    in collaborazione conES6& TypeScript this class let const () => { } map forEach (a = 10) { } […params] `Awesome string ${interpolation}`{ x, y } export import extends Symbol Typed Arrays Promise ES6 (…b) { } 9
  • 10.
    1. LISTA DELLA SPESA incollaborazione conES6 & TypeScript 10
  • 11.
    in collaborazione conES6& TypeScript WebStorm https://www.jetbrains.com/webstorm/ 11
  • 12.
    in collaborazione conES6& TypeScript Visual Studio
 Code https://code.visualstudio.com/ 12 ...consiglio però vivamente WebStorm!!!
  • 13.
    Introduzione ad ES6 Leprincipali novità
  • 14.
    in collaborazione conES6& TypeScript Molte delle novità introdotte con ES6 sono delle shortcuts rispetto ad ES5, andando a semplificare il lavoro degli sviluppatori. Per maggiori informazioni
 http://es6-features.org/ 14
  • 15.
  • 16.
    in collaborazione conES6& TypeScript Assieme a var, è stata creata let, variabile di tipo block-scoped. 16 var a = 1; var b = 2; if(a > b){ let c = 3; } console.log(c); // ReferenceError
  • 17.
    in collaborazione conES6& TypeScript È stato introdotto anche l'uso delle costanti con const 17 const PI = 3.14; console.log(PI); // 3.14 PI = 2; // invalid assignment to const 'PI'
  • 18.
  • 19.
    in collaborazione conES6& TypeScript Vengono introdotte le Arrow Functions, un modo per definire una funzione in modo più semplice. Grazie a questo costrutto viene anche risolto il problema di this all'interno degli oggetti. 19
  • 20.
    in collaborazione conES6& TypeScript 20 var log = function(msg) { console.log(msg); } var log = msg => console.log(msg);
  • 21.
    in collaborazione conES6& TypeScript 21 var c = { name: 'Pippo', greet: function(){ var setName = (newName) => this.name = newName; setName('Pluto'); } }
  • 22.
    in collaborazione conES6& TypeScript Grazie ai default parameters, è possibile valorizzare un parametro in ingresso di una funzione senza la necessità di definirlo al momento dell'utilizzo della funzione stessa. 22
  • 23.
    in collaborazione conES6& TypeScript 23 var log = function(msg = 'This is a message') { console.log(msg); } log();
  • 24.
    in collaborazione conES6& TypeScript È possibile passare n parametri in ingresso ad una funzione grazie allo spread operator. 24
  • 25.
    in collaborazione conES6& TypeScript 25 var log = function(msg, ...other) { const otherString = other.join(' '); console.log(msg + ' ' + otherString); } log('This is a message', 'a', 'b', 3);
  • 26.
  • 27.
    in collaborazione conES6& TypeScript Grazie a string interpolation, è possibile formattare una stringa, senza ricorrere alla concatenazione classica, utilizzando il simbolo `` (back-tick). Vengono mantenuti anche spazi, tabulazioni e a capo. 27
  • 28.
    in collaborazione conES6& TypeScript 28 let a = 'This is'; let b = 'a message.'; console.log(`${a} ${b}`); let a = 'This is'; let b = 'a message.'; console.log(` ${a} ${b} `);
  • 29.
  • 30.
    in collaborazione conES6& TypeScript È possibile concatenare più array grazie allo spread operator. 30
  • 31.
    in collaborazione conES6& TypeScript 31 let a = [1, 2, 3]; let b = [4, 5, 6]; console.log([...a, ...b]); console.log([...b, ...a]);
  • 32.
    in collaborazione conES6& TypeScript Grazie al destructuring è possibile mappare, valore per valore, gli elementi di un array*. 32 * utilizzabile anche su oggetti.
  • 33.
    in collaborazione conES6& TypeScript 33 const a = ['Pippo', 'Pluto']; let [firstname, lastname] = a; console.log(firstname); console.log(lastname);
  • 34.
    in collaborazione conES6& TypeScript 34 const a = ['Pippo', 'Pluto', 'Paperino']; let [firstname, , lastname] = a; console.log(firstname); console.log(lastname);
  • 35.
  • 36.
    in collaborazione conES6& TypeScript Le classi in ES6 rappresentano un modo veloce per utilizzare le funzioni come function constructor. 36
  • 37.
    in collaborazione conES6& TypeScript 37 class Person = { constructor(firstName, lastName){ this.firstName = firstName; this.lastName = lastName; } sayHi(){ return `Hi ${this.firstName}`; } } var pippo = new Person(‘Pippo’, ‘Pluto’); console.log(pippo.sayHi());
  • 38.
    in collaborazione conES6& TypeScript 38 var Person = (function () { function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } Person.prototype.sayHi = function () { return "Hi " + this.firstname + "!"; }; return Person; }()); var pippo = new Person(‘Pippo’, ‘Pluto’); console.log(pippo.sayHi());
  • 39.
    in collaborazione conES6& TypeScript Per avere maggiore controllo sulle proprietà della classe, è possibile implementare getter e setter. 39
  • 40.
    in collaborazione conES6& TypeScript 40 class Person = { constructor(firstName, lastName){ this._firstname = firstname; } get firstname() { return this._firstname; } set firstname(value) { if (this._firstname.length === 0) { this._firstname = value; } else { console.log('You cannot change the name!'); } } } var pippo = new Person(‘Pippo’, ‘Pluto’); console.log(pippo.firstname); pippo.firstname = 'Paperino';
  • 41.
    in collaborazione conES6& TypeScript È possibile estendere le classi (principio di ereditarietà). 41
  • 42.
    in collaborazione conES6& TypeScript 42 class BaseLog { constructor(){ this._logName = 'Log 1'; } log(msg){ console.log(msg); } } class Logger extends BaseLog { constructor(logName){ super(logName); } writeLine(msg){ super.log(`${msg}rn#`); } } var logger = new Logger(‘Test’); logger.log('This is a log'); logger.writeLine('This is another log');
  • 43.
  • 44.
    in collaborazione conES6& TypeScript Con ES6 è stata aggiunta la possibilità di creare dei moduli da poter esportare ed importare a seconda delle esigenze. Allo stato attuale, per poter utilizzare questa feature è necessario un module loader come CommonJS o AMD. Grazie ad Angular CLI (e Webpack), questa feature è già attiva e funzionante in un nuovo progetto Angular. 44
  • 45.
    in collaborazione conES6& TypeScript 45 // customer.js export let name = 'James'; export let city = 'Chandler'; // main.js import { name, city } from './customer'; console.log(name); console.log(city); // main2.js import * as customer from './customer'; console.log(customer.name); console.log(customer.city);
  • 46.
    7. MAPS & SETS in collaborazioneconES6 & TypeScript 46
  • 47.
    in collaborazione conES6& TypeScript Con Map e Set è possibile collezionare e salvare dei dati. Map può salvare una collezione di coppie chiave/valore (la chiave deve essere univoca). 47
  • 48.
    in collaborazione conES6& TypeScript 48 const map = new Map(); // set items map.set('Pippo', 'Pluto'); map.set('One', 'Item'); // duplicate index, ignored map.set('Pippo', 'Pluto'); // get size of map console.log(map.size); // get an item console.log(map.get('Pippo')); // check if item exists console.log(map.has('Pippo')); // delete an item map.delete('One'); // clear list map.clear();
  • 49.
    in collaborazione conES6& TypeScript Set può salvare una collezione di valori (il valore deve essere univoco). 49
  • 50.
    in collaborazione conES6& TypeScript 50 const set = new Set(); // add items set.add('Pippo'); set.add('Pluto'); // duplicate value, ignored set.add('Pippo'); // get size of set console.log(set.size); // check if item exists console.log(set.has('Pippo')); // delete an item set.delete('Pluto'); // clear list set.clear();
  • 51.
  • 52.
    in collaborazione conES6& TypeScript Tutte le feature di ES6 finora viste possono essere utilizzare fin da subito con TypeScript, permettendo, inoltre, la compatibilità con sistemi più datati*. 52 * Non tutte le possibilità di ES6 vengono supportate e convertite da TypeScript: https://kangax.github.io/compat-table/es6/
  • 53.
    1. LISTA DELLA SPESA incollaborazione conES6 & TypeScript 53
  • 54.
    in collaborazione conES6& TypeScript TypeScript npm install -g typescript https://www.typescriptlang.org/ 54
  • 55.
    in collaborazione conES6& TypeScript COME FUNZIONA TYPESCRIPT? 55
  • 56.
    in collaborazione conES6& TypeScript TypeScript, tecnicamente, è un transpiler, ossia "converte" il linguaggio con cui stiamo scrivendo (typescript) in un altro linguaggio (javascript). Poiché TypeScript è un superset di JavaScript, l'unico linguaggio utilizzato è JavaScript stesso, potenziato con alcune possibilità offerte da TypeScript. 56
  • 57.
  • 58.
    in collaborazione conES6& TypeScript È possibile tipizzare una variabile assegnando un tipo di dato 58 let a: number = 1; let b: string = 'This is a string'; let c: boolean = true; let d: undefined; let e: null = null;
  • 59.
    in collaborazione conES6& TypeScript 59 let a: number = 1; La definizione del tipo è assolutamente opzionale. Tuttavia, definire il tipo di dato previene gli errori e permette ad IDE ed editor predisposti di aiutare lo sviluppatore con suggerimenti di completamento.
  • 60.
    in collaborazione conES6& TypeScript I tipi di dato possono essere aggiunti anche a funzioni, sia per i parametri d'ingresso, che per il valore di ritorno 60 function sum(a: number, b: number): number { } function log(msg: string): void { } Il tipo void indica che non ci sono valori di ritorno.
  • 61.
    in collaborazione conES6& TypeScript Esiste un tipo particolare introdotto da TypeScript, cioè any, il quale permette di salvare qualsiasi tipo di dato (e di modificarlo nel tempo). 61 const somethingSpecial: any; È sempre buona norma usare meno any possibili!
  • 62.
    in collaborazione conES6& TypeScript Per gli array (od oggetti in generale), è possibile utilizzare due scritture diverse. 62 let d: number[] = [1, 2, 3]; let c: Array<number> = [1, 2, 3]; Il risultato sarà il medesimo, ma la seconda definizione utilizza i generics per segnare che l'array potrà contenere solo numeri.
  • 63.
  • 64.
    in collaborazione conES6& TypeScript 64 Oltre ai tipi di dato primitivi, TypeScript permette di creare dei modelli di dati personalizzati, chiamati interfaces, con i quali poter avere controllo sulle strutture dati complesse.
  • 65.
    in collaborazione conES6& TypeScript 65 interface IPerson { firstname: string; lastname: string; age: number; } Le interfacce rappresentano un contratto (una firma) da applicare alle variabili. Anche se lo ricordano, non sono oggetti JavaScript.
  • 66.
    in collaborazione conES6& TypeScript 66 interface IPerson { firstname: string; lastname: string; age: number; } let pippo: IPerson = { firstname: 'Pippo', lastname: 'Pluto', age: 33 }
  • 67.
    in collaborazione conES6& TypeScript 67 interface IPerson { firstname: string; lastname: string; age: number; weight?: number; } Alcuni elementi di una interfaccia possono essere opzionali
  • 68.
    in collaborazione conES6& TypeScript 68 class AppComponent implements OnInit { ngOnInit() { } } Le interfacce, inoltre, possono venir implementate all'interno di una classe mediante la direttiva implements. interface OnInit { ngOnInit(): void; }
  • 69.
  • 70.
    in collaborazione conES6& TypeScript 70 Lo scopo principale di uno sviluppatore non è solo quello di creare componenti con API ben definite, ma che si possano anche riutilizzare. In linguaggi come C# o Java esiste il concetto di generics, un componente che possa essere utilizzato con una varietà di tipi di dato, invece che con uno soltanto.
  • 71.
    in collaborazione conES6& TypeScript 71 function identity(arg: number): number { return arg; } Prendiamo come esempio una funzione che, dato un parametro in ingresso, ne ritorna lo stesso valore. Se volessimo far si che il tipo dell'argomento e il ritorno della funzione sia diverso per ogni tipo di dato, dovremmo creare n funzioni, una per ogni tipo.
  • 72.
    in collaborazione conES6& TypeScript 72 function identity(arg: any): any { return arg; } Potremmo utilizzare any per definire un valore generico (any, di per sé, è un tipo generico). Ma, in questo modo, perdiamo tutte le informazioni e le possibilità che ci offre TypeScript.
  • 73.
    in collaborazione conES6& TypeScript 73 function identity<T>(arg: T): T { return arg; } console.log(identity<number>(10)); console.log(identity<string>('A string')); Modificando la funzione impostandola con un generic, invece, facciamo si che sia lo sviluppatore a scegliere il tipo di dato corretto da utilizzare di volta in volta. T è solo un placeholder ed una convenzione. Può essere utilizzata qualsiasi altra lettera.
  • 74.
    5. TYPE DEFINITION FILES incollaborazione conES6 & TypeScript 74
  • 75.
    in collaborazione conES6& TypeScript 75 Finché utilizziamo i tipi di dato inclusi e gestiti da TypeScript, possiamo trarre beneficio da tutte le sue feature. Ma se volessimo utilizzare una libreria esterna, come ad esempio jQuery, con TypeScript?
  • 76.
    in collaborazione conES6& TypeScript 76 $('#app').css('background-color', 'red'); error TS2304: Cannot find name '$'.
  • 77.
    in collaborazione conES6& TypeScript 77 Per risolvere questo problema, TypeScript mette a disposizione la possibilità di creare un particolare file (.d.ts) al cui interno ci sono le definizioni dei tipi di dato.
  • 78.
    in collaborazione conES6& TypeScript 78 Definitely Typed http://definitelytyped.org/
  • 79.
    in collaborazione conES6& TypeScript 79 Typings npm install -g typings typings install --global dt~jquery --save Typings è deprecato dall'uscita di TypeScript 2.0
  • 80.
    in collaborazione conES6& TypeScript 80 @types npm install --save-dev @types/jquery Dalla versione 2.0 di TypeScript
  • 81.
    in collaborazione conES6& TypeScript © 2017 - Giovanni Buffa 81