Typescript

70
Typsicheres JavaScript

Transcript of Typescript

Page 1: Typescript

Typsicheres JavaScript

Page 2: Typescript

WHO AM I?

• Sebastian Springer

• aus München

• arbeite bei Mayflower

• https://github.com/sspringer82

• @basti_springer

• Consultant, Trainer, Autor

Page 3: Typescript

AtScript has been replaced with TypeScript

Page 4: Typescript

Also machen wir jetzt halt TypeScript

Page 5: Typescript

von

Page 6: Typescript

2012XXX. OlympiaCuriosity

Gauck 11 Bundespräsident

Page 7: Typescript

Anders Hejlsberg

• Turbo Pascal

• Delphi

• C#

• TypeScript

Page 8: Typescript

Warum Typen in JavaScript?

Jürgen Treiber / pixelio.de

Page 9: Typescript

Weniger FehlerIn JavaScript darf man so ziemlich alles machen. Manchmal will ich als Entwickler aber gar nicht alles machen können.

Page 10: Typescript

DokumentationEin Entwickler kann mit Typen ausdrücken, was er an Schnittstellen erwartet und was zurückgegeben wird.

Page 11: Typescript

Installation

berggeist007 / pixelio.de

Page 12: Typescript

npm install -g typescript

Page 13: Typescript

console.log(‘Hello World’);

index.ts

Page 14: Typescript

tsc index.tsCompiler mit verschiedenen Targets: ES3, ES5, ES6

tsc -v ES5 index.ts

Page 15: Typescript

console.log(‘Hello World’);

index.js

Page 16: Typescript

Typescript ist JavaScript

Page 17: Typescript

Mit Codeanalyse zur Compilezeit

Page 18: Typescript

var myString: string; myString = 4; console.log(myString);

tsc index.ts

test.ts(3,1): error TS2322: Type 'number' is not assignable to type 'string'.

Das Script funktioniert aber trotzdem.

Page 19: Typescript

var myVar = 'Hello World'; myVar = function () { return myVar; }; console.log(myVar());

[Function]

Page 20: Typescript

var myVar: string = 'Hello World'; myVar = function () { return myVar; }; console.log(myVar());

test.ts(2,1): error TS2322: Type '() => string' is not assignable to type 'string'. test.ts(6,13): error TS2349: Cannot invoke an expression whose type lacks a call signature.

Page 21: Typescript

Datentypen

Tim Reckmann / pixelio.de

Page 22: Typescript

Boolean

var myBool: boolean = true;

Page 23: Typescript

Number

var myNum: number = 1337; var my2ndNum: number = 3.141;

Und nein, auch in Typescript haben wir keine Unterscheidung zwischen Integer und Float.

Page 24: Typescript

String

var myStr: string = 'Hello';

Single Quotes, Double Quotes und Backticks sind erlaubt.

Page 25: Typescript

Array

var arr: number[] = [1, 2, 3]; var arr2: Array<number> = [1, 2, 3];

var arr: (string|number)[] = [];arr.push(1);arr.push('Hello');

Arrays mit verschiedenen Typen? Union Types!

Page 26: Typescript

Enum

Mengen von Ganzzahlen mit verständlichen Namen.

enum Food {Burger, Pizza, Schnitzel} console.log(Food.Pizza); // 1if (2 === Food.Schnitzel) { console.log('yummy!')} // yummy!

Page 27: Typescript

Any

Der Standardtyp, der alle anderen Typen beinhaltet. Erleichtert den Umstieg von bestehendem JavaScript auf Typescript

erheblich.

Page 28: Typescript

Void

function sayHello(name: string): void { console.log('Hello ' + name);} sayHello('Klaus');

Die Abwesenheit eines Wertes.

Page 29: Typescript

Funktionen

René Golembewski / pixelio.de

Page 30: Typescript

function add(a: number, b: number): number { return a + b;}

Parameterliste

Rückgabewert

Page 31: Typescript

function add(a: number, b: number): number { return a + b;}

add(1, 2);

add(); error TS2346: Supplied parameters do not match any signature of call

target.

add(1); error TS2346: Supplied parameters do not match any signature of call

target.

add(1, 2, 3); error TS2346: Supplied parameters do not match any signature of call

target.

add('Hello', 'World');TS2345: Argument of type 'string' is not assignable to parameter of

type 'number'.

Page 32: Typescript

Type inferenceoder: Das fröhliche Typen-Raten

Page 33: Typescript

var x = 3; // var x: number = 3;function add(a: number, b: number) { if (a % 2 === 0) { return a + b; } return 'Hello'; }

TS2354: No best common type exists among return expressions.

Page 34: Typescript

Klassen

Manfred Jahreis / pixelio.de

Page 35: Typescript

class Rectangle {}

var rect: Rectangle;

rect = new Rectangle();

Klassendefinition

Instanziierung

Variablendeklaration

Page 36: Typescript

var Rectangle = (function () { function Rectangle() { } Rectangle.prototype.getHeight = function () { return this.height; }; return Rectangle; })();

Ein Beispiel für eine kompilierte Typescript-Klasse:

Page 37: Typescript

Eigenschaften

Page 38: Typescript

Eigenschaften

class Rectangle { height: number = 20; width: number = 20; perimeter: number; } var rect: Rectangle;rect = new Rectangle();

Page 39: Typescript

Methoden

Page 40: Typescript

Methodenclass Rectangle { height: number = 20; width: number = 20; perimeter: number; getPerimeter(): number { if (this.perimeter) { return this.perimeter; } this.perimeter = this.height * 2 + this.width * 2; return this.perimeter; }}

Page 41: Typescript

Konstruktor

Page 42: Typescript

Konstruktor

class Rectangle { height: number; width: number; constructor(height: number, width: number) { this.height = height; this.width = width; }} var rect: Rectangle;rect = new Rectangle(20, 40);

Page 43: Typescript

Konstruktor - Shortcut

class Rectangle { constructor(public height: number, public width: number) { }} var rect: Rectangle;rect = new Rectangle(20, 40);

Page 44: Typescript

public, protected, private?

Page 45: Typescript

Rike / pixelio.de

Page 46: Typescript

class Rectangle { private perimeter: number; constructor(public height: number, public width: number) { this.height = height; this.width = width; } getPerimeter(): number { if (this.perimeter) { return this.perimeter; } this.perimeter = this.height * 2 + this.width * 2; return this.perimeter; }} var rect: Rectangle;rect = new Rectangle(20, 40);console.log(rect.perimeter);

error TS2341: Property 'perimeter' is private and only accessible within class 'Rectangle'.

Page 47: Typescript

Vererbung

Page 48: Typescript

class Square extends Rectangle { constructor(side: number) { super(side, side); }} var square = new Square(20);

extends-Schlüsselwort

super für den Zugriff auf Parent

Page 49: Typescript

Static

Page 50: Typescript

class Square extends Rectangle { constructor(side: number) { super(side, side); } static getBiggerOne(a: Rectangle, b: Rectangle): Rectangle { if (a.getPerimeter() >= b.getPerimeter()) { return a; } else { return b; } }} var sq1 = new Square(15); var sq2 = new Square(10); console.log(Square.getBiggerOne(sq1, sq2));

funktioniert auch für Eigenschaften

Page 51: Typescript

Interfaces

Marc Boberach / pixelio.de

Page 52: Typescript

Interfaces

Definieren die Mindestanforderung an die Struktur eines Typs. Interfaces können anonym oder benannt verwendet

werden und kommen sowohl für Klassen als auch Funktionen zum Einsatz. Interfaces können andere Interfaces erweitern.

Page 53: Typescript

Interfaces

function greet(person: {name: string}): string { return 'Hello ' + person.name; } var paul = {name: 'Paul', age: 42}; console.log(greet(paul));

Page 54: Typescript

Interfaces

interface Person { name: string; getName: () => string; } function greet(person: Person): string { return 'Hello ' + person.getName();} var lisa = {name: 'Lisa', getName: function() {return this.name}};console.log(greet(lisa));

Page 55: Typescript

Generics

Rüdiger Knappe / pixelio.de

Page 56: Typescript

Generics

Klassen und Interfaces, bei denen der Typ noch nicht feststeht.

Page 57: Typescript

Genericsclass Collection<T extends {id: number}> { private items: T[] = []; getItem(id: number): T { return this.items.find((item) => { return (item.id === id) ? item : null; }) } setItem(item: T) { this.items.push(item); }} class Person { constructor(public id, public name) {}} var myColl = new Collection<Person>();myColl.setItem(new Person(1, 'Mary'));console.log(myColl.getItem(1));

Page 58: Typescript

Module

URSfoto / pixelio.de

Page 59: Typescript

Module

Namespacing für Applikationen, um Namenskonflikte zu vermeiden. Definition von Abhängigkeiten im Quellcode. Zwei

Varianten von Modulen: interne und externe.

Page 60: Typescript

Interne Module

module Shapes { export class Rectangle { constructor(public height: number, public width: number) {} }} var rect = new Shapes.Rectangle(15, 20); console.log(rect);

Page 61: Typescript

Interne Module

tsc --out sample.js index.ts

index.ts/// <reference path="shape.ts" />var rect = new Shapes.Rectangle(15, 20);console.log(rect);

module Shapes { export class Rectangle { constructor(public height: number, public width: number) {} }}

shape.ts

Page 62: Typescript

Externe Module

Können mit anderen Modulloadern wie require.js oder dem Node.js-Modulsystem verwendet werden.

Externe Module benötigen mindestens ein Toplevel export oder import.

Kommandozeilenoption —module für den Compiler. Mögliche Werte sind commonjs (Node.js) und amd

(require.js).

Page 63: Typescript

Externe Moduleimport shape = require('shape');var rect = new shape.Rectangle(30, 40);console.log(rect);

index.ts

export class Rectangle { constructor(public height: number, public width: number) {}}

shape.ts

tsc --module commonjs index.ts

Page 64: Typescript

Weitere ES6 Features

gänseblümchen / pixelio.de

Page 65: Typescript

Weitere ES6 Features• for..of

• Symbols

• Spread Operator

• let und const

• Template Strings

Page 66: Typescript

3rd Party Libraries

Page 67: Typescript

3rd Party Libraries

Headerdateien für 3rd Party Libraries wie jQuery oder Angular, damit diese auch mit Typescript sinnvoll verwendet

werden können.

Page 68: Typescript

3rd Party Libraries

/// <reference path="jquery/jquery.d.ts" />

http://definitelytyped.org/

Page 69: Typescript

Fragen?

Rainer Sturm / pixelio.de

Page 70: Typescript

KONTAKT

Sebastian Springer [email protected]

Mayflower GmbH Mannhardtstr. 6 80538 München Deutschland

@basti_springer

https://github.com/sspringer82