single page applikationer med typescript...types •null, string, number, boolean, undefined...

48
TypeScript - a look at SPA's and Angular 2 Christian Holm Diget

Upload: others

Post on 23-May-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

TypeScript ❤- a look at SPA's and Angular 2

Christian Holm Diget

Page 2: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Agenda

• EcmaScript 6

• TypeScript

• Libraries: ImmutableJS + React

• SPA architecture

• Angular 2.0

Page 3: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)
Page 4: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

EcmaScript 6/2015

Page 5: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Let + const

function f() {{

let x;{

// okay, block scoped nameconst x = "valid";// error, constx = "bar";

}// error, already declared in blocklet x = "inner";

}}

Page 6: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Arrow functions

var self = this;$('body').on('click', 'a', function(e) {

//self});

$('body').on('click', 'a', e => {//this

});

Page 7: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

for…of

for (var n of fibonacci) {// stop at 1000if (n > 1000)

break;console.log(n);

}

Page 8: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Template strings

var car = "Porche", feeling = "awesome";`My ${car} is making me feel ${feeling}!`

Page 9: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Default arguments

function f(x, y = 100) {return x + y;

}

Page 10: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Rest

function f(x, ...y) {return x * y.length;

}

f(100, "volvo", true);

Page 11: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Spread

function addThree(x, y, z) {return x + y + z;

}

addThree(...[100, 50, 25]);

Page 12: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Destructuring

var [a, , b] = [6, 12, 18];

var {name, cylinders, color} = {name: "Audi", cylinders: 8, color: "black"};

Page 13: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Modules

export function fiat() { return "Fiat" }export function peugeot() { return "Peugeot" }

import * as Cars from "my/cars";import { fiat, peugeot } from "my/cars";

Page 14: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Classes

class Ferrari extends Car {constructor(cylinders, color) {

super(cylinders, color);

this.color = color;}start() {

super.start();}static race(cars) {

cars.forEach(car =>car.start()

);}

}

Page 15: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)
Page 16: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

TypeScript

• Superset af JavaScript

• Brug ES6 features og compile til ES3 eller ES5

• Static type checking

• Interfaces

• Generics

• Tooling

Page 17: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Types

• Null, string, number, boolean, undefined• Object, array• Interface, Class, Enum, Any

function ToString(name: string, age: number) : string {return name + age;

};

Page 18: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Default and optional

function ToString(firstName : string = "John Doe", lastName?: string): string {if (lastName) {

return firstName + " " + lastName;}return firstName;

};

Page 19: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Classes

class Person {public age: number;

constructor(public name: string, ageParam: number) {this.age = ageParam;

}

public ToString() : string {return this.name + this.age;

}}

Page 20: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Generics

class Collection<T>{

private items: Array<T>;

public Add(item: T) {this.items.push(item);

}}

Page 21: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Interfaces

interface IPrintable {ToString() : string;

}

class Person implements IPrintable {public age: number;

constructor(public name: string, ageParam: number) {this.age = ageParam;

}

public ToString() : string {return this.name + this.age;

}}

Page 22: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Definitions

• https://github.com/borisyankov/DefinitelyTyped

declare function domready(callback: () => any): void;

declare module "domready" {export = domready;

}

Page 23: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Adoption

Page 24: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

ImmutableJS

var map1: Immutable.Map<string, number>;map1 = Immutable.Map({ foo: 1, bar: 2, baz: 3 });var map2 = map1.set('bar', 25);map1.get('bar'); // 2map2.get('bar'); // 25

Data structuresList, Map, Set, Records etc.

SequencesConvertion from/to objects

Page 25: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Sequences

Immutable.Range(1, Infinity).skip(1000).map(n => -n).filter(n => n % 2 === 0).take(2).reduce((r, n) => r * n, 1);

Page 26: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

React

TS 1.6 comes with JSX support (tsx)

var HelloWorld = React.createClass({render: function () {

return <div>Hello {this.props.name } </div>;}

});

React.render(<HelloWorld name="John" />, mountNode);

Page 27: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Single Page Application Architektur

Services

Components

Komposition / DI

Data

Views

Binding

Interaction og rendering

System arkitektur

Page 28: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Libraries vs frameworks

Page 29: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

1. Build small components

2. Composition over inheritence

3. Loose coupling, high cohesion

Page 30: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Application architecture

Page 31: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Services

export class CarService {

public doStuff(car : Car) {...

}}

Page 32: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Composition with SystemJS

/* Configure */System.config({

baseURL: '/lib/',paths: {

'*': '*.js'}

});

System.import('app');

/* Use in App.js */var carFactory = require('./cars').carFactory;

var audi = carFactory("Audi", 8);

Page 33: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)
Page 34: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Componentsclass ProductWidget {

constructor(private el: HTMLElement, private product: Product) { }

public Render() {var output = Mustache.render(

'Navn: {{product.name}} ' +'Beskrivelse: {{product.description}}',product);

this.el.innerHTML = output;}

public SetPrice(price: number) { ... }};

new ProductWidget(document.getElementById("prod1"),new Product("Red Bull", "Gi’r vinger", 20));

Page 35: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

View rendering

Page 36: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Templates with Mustache

var model = {cars: [

{ make: "Audi", model: "A1" },{ make: "Chevrolet", model: "Aveo" }

]};

var output = Mustache.render('{{#cars}}<tr><td>{{make}}</td><td>{{model}}</td></tr>{{/cars}}',model);

document.getElementById("demo").innerHTML = output;

Page 37: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Data… Routing, validation etc.

Q.xhr.get('/api/products').done((response) => {...

});

Page 38: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)
Page 39: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Angular 2.0 alpha

• Mobile first

• 5x faster according to google

• Fewer concepts

• Based on webstandards

• AtScript -> TypeScript

• angular.io

• angular-tips.com

Page 40: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Angular 2 languages

• ES5, ES6

• TypeScript

• Dart

Page 41: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Dependencies

• traceur-runtime.js (transpiler)

• system.js (dynamic module loader)

• angular2.d.ts

• rx.d.ts

• es6-promise.d.ts

• https://code.angularjs.org/2.0.0-alpha.37/angular2.dev.js

Page 42: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Annotations

@Component({selector: 'mywidget‘

})@View({

template:'<div *for="#element in elements">{{element.someProperty}}</div>',directives: [For]

})

Page 43: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

View Syntax

• Interpolation: {{ expression | pipe }}

• Variable: #variable

• Event bindings: (click) = ""

• Property bindings: [hidden] = ""

• Template directive: *ng-for, *ng-if

Page 44: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Components

• Application = tree of components

@Component({selector: 'mywidget'

})@View({

template:'<div *ng-for="#element in elements">{{element.someProperty}}</div>',directives: [NgFor]

})class MyWidget {

constructor(myService: MyService){ … }

}

Page 45: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Dependency Injection

import {CarService} from 'carService';

@Component({selector: 'carwidget'

})@View({…})class CarWidget {

constructor(carService: CarService) {…}}

Page 46: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)

Takeaways

• EcmaScript 6

• …and how to use it today

• TypeScript

• ImmutableJS

• SPA architecture and patterns

• A glimpse into Angular 2.0

[email protected]

www.dotnetnerd.dk

@dotnetnerd

Page 47: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)
Page 48: Single Page Applikationer med TypeScript...Types •Null, string, number, boolean, undefined •Object, array •Interface, Class, Enum, Any function ToString(name: string, age: number)