SlideShare a Scribd company logo
TypeScript Introduction
TypeScript
Hans Höchtl
Technical Director @ Onedrop
PHP, Java, Ruby Developer
TYPO3 Solr, Neos
Back in time to the beginning of
JavaScript
• Developed in 10 days back in 1995
• Target: Easy script interaction for hobby
programmers in the browser, who can’t write
Java
• 1996 handed over to ECMA for standardization
• ECMAScript 5 (spec. 1999) supported by all
browsers (>=IE9)
JavaScript - What happened?
• CoffeeScript
• Modularization (requireJS, AMD, etc.)
• jQuery
• NodeJS
JavaScript - In the enterprise?
• Not typesafe
• No objects/classes
• Hard to test
• Bad Async handling
TypeScript to the rescue
• Released 2012 by Microsoft
• Developed by Anders Hejlsberg (C#, Delphi)
• Compiles to JavaScript (configurable version)
• Full OOP
• Type-safe
• JavaScript compatible
ES5

JavaScript 1.5
ES2015 (ES6) TypeScript
Buzzword bingo
Types
var / let / const
Inheritance
Promises
Generics
Fat arrow
Interfaces
Decorators
public / private
Moduls
Class
Typing
var foo: string = 'bar';
var bar: any = ['lorem', 2];
function (p: Person) {
console.log(p.lastName);
}
function getAddress(): Address {
return this.address;
}
function getCountAndObject(): [number, any] {
return [this.addresses.length, this.addresses];
}
Types
// Primitives
var foo: string = 'bar';
var bar: any = ['lorem', 2];
// Arrays
var listOfSomething: number[] = [1,2,3];
var listOfSomething: Array<number> = [1,2,3];
// Tuples
var tuple: [string, number] = ['Hello', 5];
// Enum
enum Color {Red, Green, Blue};
var c: Color = Color.Green;
// Casting
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
// Literals
type Easing = "ease-in" | "ease-out" | "ease-in-out";
Destructuring
let [first, second] = [1, 2];
// swap variables
[first, second] = [second, first];
// destructure arrays
let [first, ...rest] = [1, 2, 3, 4];
let [, second, , fourth] = [1, 2, 3, 4];
// objects
let o = {
a: "foo",
b: 12,
c: "bar"
}
let {a, b} = o;
Usage
npm install -g typescript
tsc hello.ts
class Student {
fullName: string;
constructor(public firstName, public
middleInitial, public lastName) {
this.fullName = firstName + " " +
middleInitial + " " + lastName;
}
}
interface Person {
firstName: string;
lastName: string;
}
function greeter(person : Person) {
return "Hello, " + person.firstName + " " +
person.lastName;
}
var user = new Student("Jane", "M.", "User");
document.body.innerHTML = greeter(user);
var Student = (function () {
function Student(firstName, middleInitial,
lastName) {
this.firstName = firstName;
this.middleInitial = middleInitial;
this.lastName = lastName;
this.fullName = firstName + " " +
middleInitial + " " + lastName;
}
return Student;
}());
function greeter(person) {
return "Hello, " + person.firstName + " " +
person.lastName;
}
var user = new Student("Jane", "M.", "User");
document.body.innerHTML = greeter(user);
DEMO
TypeScript Integrations
• grunt
• gulp
• browserify
• webpack
• jspm
Variable scoping
var foo: string = 'bar';
let foo: string = 'bar';
const foo: string = 'bar';
var let const
scope function block block
immutable No No Yes
Standard ever ES2015 / TS ES2015 / TS
Usecase Not any more ~30% ~70%
DEMO
Variable scoping
function f(condition: boolean, x: number) {
if (condition) {
let x = 100;
return x;
}
return x;
}
f(false, 0); // returns 0
f(true, 0); // returns 100
Variable scoping
function f(condition, x) {
if (condition) {
var x_1 = 100;
return x_1;
}
return x;
}
f(false, 0); // returns 0
f(true, 0); // returns 100
Interfaces
interface Person {
firstName: string;
lastName: string;
middleName?: string;
}
function combinedName(person: Person): string {
if (person.middleName) {
return person.middleName + ' ' + person.lastName;
} else {
return person.firstName + ' ' + person.lastName;
}
}
Inheriting interfaces
interface Shape {
color: string;
}
interface Square extends Shape {
sideLength: number;
}
const square = <Square>{};
square.color = "blue";
square.sideLength = 10;
Classes
interface ClockConstructor {
new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
tick();
}
function createClock(ctor: ClockConstructor, hour: number, minute: number):
ClockInterface {
return new ctor(hour, minute);
}
class DigitalClock implements ClockInterface {
constructor(h: number, m: number) { }
tick() {
console.log("beep beep");
}
}
class AnalogClock implements ClockInterface {
constructor(h: number, m: number) { }
tick() {
console.log("tick tock");
}
}
let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);
Classes property visibility
class Person {
protected name: string;
constructor(name: string) { this.name = name; }
}
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public getElevatorPitch() {
return `Hello, my name is ${this.name} and I work in $
{this.department}.`;
}
}
let howard = new Employee("Howard", "Sales");
console.log(howard.getElevatorPitch());
console.log(howard.name); // error
Interfaces extending Classes
class Control {
private state: any;
}
interface SelectableControl extends Control {
select(): void;
}
class Button extends Control {
select() { }
}
class TextBox extends Control {
select() { }
}
class Image extends Control {
}
class Location {
select() { }
}
Solving the "this" problem
$('#any-button').on('click', function() {
$(this).text('Clicked');
$.get('http://some.api/foo.json').success(function(){
$(this).text('Result');
});
}
$('#any-button').on('click', function() {
$(this).text('Clicked');
var btn = this;
$.get('http://some.api/foo.json').success(function(){
$(btn).text('Result');
});
}
Fatarrow
$('#any-button').on('click', function() {
$(this).text('Clicked');
$.get('http://some.api/foo.json').success(() => {
$(this).text('Result');
});
}
const sum = (a, b) => a+b
const even = n => {
const rest = n % 2
return rest === 0
}
Generics
function identity<T>(arg: T): T {
return arg;
}
let strOutput = identity<string>("foobar");
let numOutput = identity<number>(42);
Generics
class Cake {…}
class Phone {…}
class Box {…}
function box <T> (content: T): Box<T> {
const myBox = new Box<T>(content);
return myBox;
}
box<Cake>(new Cake()) // a box with a cake
box<Phone>(new Phone()) // a box with a phone
box(new Cake()) // also a box with a cake => inference
Iterables
let list = [4, 5, 6];
for (let i in list) {
console.log(i); // "0", "1", "2",
}
for (let i of list) {
console.log(i); // "4", "5", "6"
}
Modules
• Scoping of variables (out of global)
• Code re-use
• Lazy/Async loadable
• Encapsulation
• DRY
• Ease of testing
Modules
• No Modules (or IIFE)
• CommonJS (node.js, SystemJS, Browserify)
• AMD (require.js, SystemJS)
• ES6 (for ES2015 compatible modules)
https://0fps.net/2013/01/22/commonjs-why-and-how/
Modules
export interface IBook {
title: string
pages: number
}
export default class Book implements IBook {
constructor(public title: string, public
pages: number){}
}
import Book, {IBook} from './book'
export interface IBookshelf {
books: IBook[]
maxSize: number
}
export default class Bookshelf implements
IBookshelf {
books: IBook[] = []
constructor (public maxSize: number) {}
addBook (book: IBook) {
if (this.books.length < this.maxSize) {
this.books.push(book)
}
}
import Book from './book'
import Bookshelf from './bookshelf'
let myBookshelf = new Bookshelf(40)
let tsHandbook = new Book('TS Handbook', 42)
myBookshelf.addBook(tsHandbook)
book.ts
bookshelf.ts
index.ts
DEMO
JavaScript integration
• Already loaded JS libs are ambient modules
• Typedefinition files [library].d.ts provide typed
interfaces for TypeScript
• Typings is a Definition Manager that loads,
updates and maintains definition files
https://github.com/Microsoft/TypeScriptSamples/tree/master/jquery
hhoechtl@1drop.de

@hhoechtl

http://blog.1drop.de

More Related Content

PDF
Fertile Ground: The Roots of Clojure
KEY
Code as data as code.
PDF
Are we ready to Go?
PDF
The Macronomicon
ODP
Naïveté vs. Experience
PDF
The Browser Environment - A Systems Programmer's Perspective
PPTX
Type Driven Development with TypeScript
PDF
C++ L08-Classes Part1
Fertile Ground: The Roots of Clojure
Code as data as code.
Are we ready to Go?
The Macronomicon
Naïveté vs. Experience
The Browser Environment - A Systems Programmer's Perspective
Type Driven Development with TypeScript
C++ L08-Classes Part1

What's hot (20)

PDF
Java VS Python
PDF
Go a crash course
ODP
EcmaScript 6
PDF
ClojurianからみたElixir
PPT
Collection Core Concept
PDF
Beginning Python
PDF
Implementing Software Machines in C and Go
KEY
Why Learn Python?
PPTX
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
PPTX
Groovy puzzlers по русски с Joker 2014
PPTX
TDC2016POA | Trilha .NET - C# como você nunca viu: conceitos avançados de pro...
PDF
Go ahead, make my day
PDF
JavaScript ES6
PPTX
TDC2016POA | Trilha .NET - CQRS e ES na prática com RavenDB
PDF
Go for the paranoid network programmer, 3rd edition
PDF
Design Pattern Observations
PDF
ES6 - Next Generation Javascript
PDF
Introduction to TypeScript
PPTX
Es6 hackathon
PPTX
Introduction to TypeScript
Java VS Python
Go a crash course
EcmaScript 6
ClojurianからみたElixir
Collection Core Concept
Beginning Python
Implementing Software Machines in C and Go
Why Learn Python?
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
Groovy puzzlers по русски с Joker 2014
TDC2016POA | Trilha .NET - C# como você nunca viu: conceitos avançados de pro...
Go ahead, make my day
JavaScript ES6
TDC2016POA | Trilha .NET - CQRS e ES na prática com RavenDB
Go for the paranoid network programmer, 3rd edition
Design Pattern Observations
ES6 - Next Generation Javascript
Introduction to TypeScript
Es6 hackathon
Introduction to TypeScript
Ad

Similar to TypeScript Introduction (20)

PDF
What can be done with Java, but should better be done with Erlang (@pavlobaron)
PDF
The Ring programming language version 1.5 book - Part 3 of 31
PDF
The Ring programming language version 1.5.2 book - Part 14 of 181
PPTX
KotlinForJavaDevelopers-UJUG.pptx
PPT
TechTalk - Dotnet
PDF
The Ring programming language version 1.10 book - Part 22 of 212
PPSX
C# 6.0 - April 2014 preview
PDF
No excuses, switch to kotlin
PDF
OOP_EXPLAINED_example_of_cod_and_explainations.pdf
PPT
Initial Java Core Concept
KEY
Introduction to Groovy
PPTX
Best of build 2021 - C# 10 & .NET 6
PPT
Groovy Introduction - JAX Germany - 2008
PDF
C# - What's next
PPTX
Anti patterns
PDF
TypeScript Introduction
PPTX
Object Oriented Programming Using C++: C++ Namespaces.pptx
PDF
Node lt
PDF
TypeScript Best Practices
PDF
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
What can be done with Java, but should better be done with Erlang (@pavlobaron)
The Ring programming language version 1.5 book - Part 3 of 31
The Ring programming language version 1.5.2 book - Part 14 of 181
KotlinForJavaDevelopers-UJUG.pptx
TechTalk - Dotnet
The Ring programming language version 1.10 book - Part 22 of 212
C# 6.0 - April 2014 preview
No excuses, switch to kotlin
OOP_EXPLAINED_example_of_cod_and_explainations.pdf
Initial Java Core Concept
Introduction to Groovy
Best of build 2021 - C# 10 & .NET 6
Groovy Introduction - JAX Germany - 2008
C# - What's next
Anti patterns
TypeScript Introduction
Object Oriented Programming Using C++: C++ Namespaces.pptx
Node lt
TypeScript Best Practices
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Ad

Recently uploaded (20)

PDF
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PPTX
Introduction to Artificial Intelligence
PDF
Nekopoi APK 2025 free lastest update
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PPTX
Why Generative AI is the Future of Content, Code & Creativity?
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
iTop VPN Free 5.6.0.5262 Crack latest version 2025
PPTX
Log360_SIEM_Solutions Overview PPT_Feb 2020.pptx
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PPTX
Computer Software and OS of computer science of grade 11.pptx
PPTX
Reimagine Home Health with the Power of Agentic AI​
PDF
System and Network Administraation Chapter 3
PDF
top salesforce developer skills in 2025.pdf
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Introduction to Artificial Intelligence
Nekopoi APK 2025 free lastest update
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Navsoft: AI-Powered Business Solutions & Custom Software Development
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Why Generative AI is the Future of Content, Code & Creativity?
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Odoo Companies in India – Driving Business Transformation.pdf
Design an Analysis of Algorithms I-SECS-1021-03
iTop VPN Free 5.6.0.5262 Crack latest version 2025
Log360_SIEM_Solutions Overview PPT_Feb 2020.pptx
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Computer Software and OS of computer science of grade 11.pptx
Reimagine Home Health with the Power of Agentic AI​
System and Network Administraation Chapter 3
top salesforce developer skills in 2025.pdf

TypeScript Introduction

  • 3. Hans Höchtl Technical Director @ Onedrop PHP, Java, Ruby Developer TYPO3 Solr, Neos
  • 4. Back in time to the beginning of
  • 5. JavaScript • Developed in 10 days back in 1995 • Target: Easy script interaction for hobby programmers in the browser, who can’t write Java • 1996 handed over to ECMA for standardization • ECMAScript 5 (spec. 1999) supported by all browsers (>=IE9)
  • 6. JavaScript - What happened? • CoffeeScript • Modularization (requireJS, AMD, etc.) • jQuery • NodeJS
  • 7. JavaScript - In the enterprise? • Not typesafe • No objects/classes • Hard to test • Bad Async handling
  • 8. TypeScript to the rescue • Released 2012 by Microsoft • Developed by Anders Hejlsberg (C#, Delphi) • Compiles to JavaScript (configurable version) • Full OOP • Type-safe • JavaScript compatible
  • 10. Buzzword bingo Types var / let / const Inheritance Promises Generics Fat arrow Interfaces Decorators public / private Moduls Class
  • 11. Typing var foo: string = 'bar'; var bar: any = ['lorem', 2]; function (p: Person) { console.log(p.lastName); } function getAddress(): Address { return this.address; } function getCountAndObject(): [number, any] { return [this.addresses.length, this.addresses]; }
  • 12. Types // Primitives var foo: string = 'bar'; var bar: any = ['lorem', 2]; // Arrays var listOfSomething: number[] = [1,2,3]; var listOfSomething: Array<number> = [1,2,3]; // Tuples var tuple: [string, number] = ['Hello', 5]; // Enum enum Color {Red, Green, Blue}; var c: Color = Color.Green; // Casting let someValue: any = "this is a string"; let strLength: number = (<string>someValue).length; // Literals type Easing = "ease-in" | "ease-out" | "ease-in-out";
  • 13. Destructuring let [first, second] = [1, 2]; // swap variables [first, second] = [second, first]; // destructure arrays let [first, ...rest] = [1, 2, 3, 4]; let [, second, , fourth] = [1, 2, 3, 4]; // objects let o = { a: "foo", b: 12, c: "bar" } let {a, b} = o;
  • 14. Usage npm install -g typescript tsc hello.ts class Student { fullName: string; constructor(public firstName, public middleInitial, public lastName) { this.fullName = firstName + " " + middleInitial + " " + lastName; } } interface Person { firstName: string; lastName: string; } function greeter(person : Person) { return "Hello, " + person.firstName + " " + person.lastName; } var user = new Student("Jane", "M.", "User"); document.body.innerHTML = greeter(user); var Student = (function () { function Student(firstName, middleInitial, lastName) { this.firstName = firstName; this.middleInitial = middleInitial; this.lastName = lastName; this.fullName = firstName + " " + middleInitial + " " + lastName; } return Student; }()); function greeter(person) { return "Hello, " + person.firstName + " " + person.lastName; } var user = new Student("Jane", "M.", "User"); document.body.innerHTML = greeter(user);
  • 15. DEMO
  • 16. TypeScript Integrations • grunt • gulp • browserify • webpack • jspm
  • 17. Variable scoping var foo: string = 'bar'; let foo: string = 'bar'; const foo: string = 'bar'; var let const scope function block block immutable No No Yes Standard ever ES2015 / TS ES2015 / TS Usecase Not any more ~30% ~70%
  • 18. DEMO
  • 19. Variable scoping function f(condition: boolean, x: number) { if (condition) { let x = 100; return x; } return x; } f(false, 0); // returns 0 f(true, 0); // returns 100
  • 20. Variable scoping function f(condition, x) { if (condition) { var x_1 = 100; return x_1; } return x; } f(false, 0); // returns 0 f(true, 0); // returns 100
  • 21. Interfaces interface Person { firstName: string; lastName: string; middleName?: string; } function combinedName(person: Person): string { if (person.middleName) { return person.middleName + ' ' + person.lastName; } else { return person.firstName + ' ' + person.lastName; } }
  • 22. Inheriting interfaces interface Shape { color: string; } interface Square extends Shape { sideLength: number; } const square = <Square>{}; square.color = "blue"; square.sideLength = 10;
  • 23. Classes interface ClockConstructor { new (hour: number, minute: number): ClockInterface; } interface ClockInterface { tick(); } function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface { return new ctor(hour, minute); } class DigitalClock implements ClockInterface { constructor(h: number, m: number) { } tick() { console.log("beep beep"); } } class AnalogClock implements ClockInterface { constructor(h: number, m: number) { } tick() { console.log("tick tock"); } } let digital = createClock(DigitalClock, 12, 17); let analog = createClock(AnalogClock, 7, 32);
  • 24. Classes property visibility class Person { protected name: string; constructor(name: string) { this.name = name; } } class Employee extends Person { private department: string; constructor(name: string, department: string) { super(name); this.department = department; } public getElevatorPitch() { return `Hello, my name is ${this.name} and I work in $ {this.department}.`; } } let howard = new Employee("Howard", "Sales"); console.log(howard.getElevatorPitch()); console.log(howard.name); // error
  • 25. Interfaces extending Classes class Control { private state: any; } interface SelectableControl extends Control { select(): void; } class Button extends Control { select() { } } class TextBox extends Control { select() { } } class Image extends Control { } class Location { select() { } }
  • 26. Solving the "this" problem $('#any-button').on('click', function() { $(this).text('Clicked'); $.get('http://some.api/foo.json').success(function(){ $(this).text('Result'); }); } $('#any-button').on('click', function() { $(this).text('Clicked'); var btn = this; $.get('http://some.api/foo.json').success(function(){ $(btn).text('Result'); }); }
  • 27. Fatarrow $('#any-button').on('click', function() { $(this).text('Clicked'); $.get('http://some.api/foo.json').success(() => { $(this).text('Result'); }); } const sum = (a, b) => a+b const even = n => { const rest = n % 2 return rest === 0 }
  • 28. Generics function identity<T>(arg: T): T { return arg; } let strOutput = identity<string>("foobar"); let numOutput = identity<number>(42);
  • 29. Generics class Cake {…} class Phone {…} class Box {…} function box <T> (content: T): Box<T> { const myBox = new Box<T>(content); return myBox; } box<Cake>(new Cake()) // a box with a cake box<Phone>(new Phone()) // a box with a phone box(new Cake()) // also a box with a cake => inference
  • 30. Iterables let list = [4, 5, 6]; for (let i in list) { console.log(i); // "0", "1", "2", } for (let i of list) { console.log(i); // "4", "5", "6" }
  • 31. Modules • Scoping of variables (out of global) • Code re-use • Lazy/Async loadable • Encapsulation • DRY • Ease of testing
  • 32. Modules • No Modules (or IIFE) • CommonJS (node.js, SystemJS, Browserify) • AMD (require.js, SystemJS) • ES6 (for ES2015 compatible modules) https://0fps.net/2013/01/22/commonjs-why-and-how/
  • 33. Modules export interface IBook { title: string pages: number } export default class Book implements IBook { constructor(public title: string, public pages: number){} } import Book, {IBook} from './book' export interface IBookshelf { books: IBook[] maxSize: number } export default class Bookshelf implements IBookshelf { books: IBook[] = [] constructor (public maxSize: number) {} addBook (book: IBook) { if (this.books.length < this.maxSize) { this.books.push(book) } } import Book from './book' import Bookshelf from './bookshelf' let myBookshelf = new Bookshelf(40) let tsHandbook = new Book('TS Handbook', 42) myBookshelf.addBook(tsHandbook) book.ts bookshelf.ts index.ts
  • 34. DEMO
  • 35. JavaScript integration • Already loaded JS libs are ambient modules • Typedefinition files [library].d.ts provide typed interfaces for TypeScript • Typings is a Definition Manager that loads, updates and maintains definition files https://github.com/Microsoft/TypeScriptSamples/tree/master/jquery