57
TypeScript for Java Developers Yakov Fain yfain

TypeScript for Java Developers

Embed Size (px)

Citation preview

Page 1: TypeScript for Java Developers

TypeScript for Java Developers

Yakov Fain

yfain

Page 2: TypeScript for Java Developers

About myself

• Angular practice lead at Farata Systems

• Java Champion

• Co-authored the book “Angular 2 Development with TypeScript”

Page 3: TypeScript for Java Developers

Getting started with TypeScript

Page 4: TypeScript for Java Developers

What’s TypeScript?

• An open source superset of JavaScript developed by Microsoft

• Compiles code into JavaScript of various ECMAScript flavors

• Well supported by IDEs

• Official site: http://www.typescriptlang.org

Page 5: TypeScript for Java Developers

Why use TypeScript?

• Optional static typing

• Supports the latest and evolving JavaScript features

• More productive than JavaScript

• Supports classes, interfaces, generics, annotations, public/private/protected access and more

Page 6: TypeScript for Java Developers

Benefits of the static typing

Page 7: TypeScript for Java Developers

Benefits of the static typing

Page 8: TypeScript for Java Developers

TypeScript and IDEs

• Visual Studio Code (free)

• IntelliJ IDEA or WebStorm

• Sublime Text with TypeScript plugin

• Eclipse with TypeScript plugin

Page 9: TypeScript for Java Developers

Installing the TypeScript compiler

1. IInstall Node.js from https://nodejs.org

2. Install TypeScript compiler globally:npm i typescript -g

Page 10: TypeScript for Java Developers

let myName:string;

myName = "Yakov Fain";

console.log(`Hello ${myName}`);

tsc --t es5 hello.ts

1. Create a new file hello.ts

2. Compile hello.ts to hello.js (the ES5 flavor)

Compiling a simple script

Page 11: TypeScript for Java Developers

Compiler’s options in tsconfig.json

{ "compilerOptions": { "outDir": "./dist", "baseUrl": "src", "sourceMap": true, "moduleResolution": "node", "noEmitOnError": true, "target": “es5", "watch": true } }

Page 12: TypeScript for Java Developers

How to run code samples• Install Node.js from https://nodejs.org (use the recommended version)

• Clone or download the repository https://github.com/yfain/ts into any directory

• In the command window, change into this directory

• Install the project dependencies (TypeScript compiler) locally: npm install

• compile all code samples into the dist directory:npm run tsc

• To run a code sample (e.g. fatArrow.js): node dist/fatArrow.js

Page 13: TypeScript for Java Developers

Fat arrow functions(similar to lambdas in Java)

Page 14: TypeScript for Java Developers

Fat arrow functionsFat arrow function:

Anonymous function:

Page 15: TypeScript for Java Developers

Fat arrow functions make the meaning of the this pointer

predictable.

Page 16: TypeScript for Java Developers

Demo

node dist/fatArrow.js

Page 17: TypeScript for Java Developers

TypeScript Classes and Inheritance

Page 18: TypeScript for Java Developers

A class with constructor:take 1

Page 19: TypeScript for Java Developers

A class with constructor: take 2

Page 20: TypeScript for Java Developers

InheritanceClassical syntax Prototypal

Page 21: TypeScript for Java Developers

TypeScript Generics

Page 22: TypeScript for Java Developers

GenericsGenerics allow using parameterized types

Page 23: TypeScript for Java Developers

Generics

No Errors - TypeScript uses structural typing, while Java uses the nominal one.

Page 24: TypeScript for Java Developers

Demo1. node dist/generics.ts2. node dist/generics_comparable.ts

Page 25: TypeScript for Java Developers

TypeScript Interfaces

Page 26: TypeScript for Java Developers

Interfaces as custom types

No interfaces here

Page 27: TypeScript for Java Developers

Implementing interfaces

Page 28: TypeScript for Java Developers

Demo1. node dist/interface-as-type.ts

2. node dist/interface-implements

3. node dist/implement-class.ts

Page 29: TypeScript for Java Developers

Destructuring Objects in TypeScript

Page 30: TypeScript for Java Developers

Using destructuring to get specific object properties

Page 31: TypeScript for Java Developers

Destructuring in practice@Component({ selector: 'app', template: ` <input type="text" placeholder="Enter stock (e.g. AAPL)" (change)="onInputEvent($event)"> <br/> ̀}) class AppComponent { stock:string; onInputEvent({target}):void{ this.stock=target.value; }}

Angular

Page 32: TypeScript for Java Developers

The Union Type

Page 33: TypeScript for Java Developers

The union type

function padLeft(value: string, padding: number | string ) {...}

Using a vertical bar specify the “either/or” type

Page 34: TypeScript for Java Developers

The Intersection Type

Page 35: TypeScript for Java Developers

The intersection typeUse an ampersand to combine types

interface IPerson { firstName: string; lastName: string; age: number; ssn?: string; }

interface IEmployee{ title: string; desk: string; }

type TheWorker = IPerson & IEmployee;

let worker: TheWorker = {firstName:"John", lastName: "Smith", age:29, title:"Manager", desk:"A1,234"};

Page 36: TypeScript for Java Developers

Mixins

Page 37: TypeScript for Java Developers

Using async and await

Page 38: TypeScript for Java Developers

From callbacks to promises to async/await

Page 39: TypeScript for Java Developers

Callbacks(function getProductDetails() {

setTimeout(function () { console.log('Getting customers'); setTimeout(function () { console.log('Getting orders'); setTimeout(function () { console.log('Getting products'); setTimeout(function () { console.log('Getting product details') }, 1000); }, 1000); }, 1000); }, 1000); })();

Page 40: TypeScript for Java Developers

function getCustomers(){

let promise = new Promise( function (resolve, reject){

console.log("Getting customers"); // Emulate an async server call here setTimeout(function(){ let success = true; if (success){ resolve( "John Smith"); // got customer }else{ reject("Can't get customers"); } },1000);

} ); return promise; }

Promises

Page 41: TypeScript for Java Developers

function getCustomers(){

let promise = new Promise( function (resolve, reject){

console.log("Getting customers"); // Emulate an async server call here setTimeout(function(){ let success = true; if (success){ resolve( "John Smith"); // got customer }else{ reject("Can't get customers"); } },1000);

} ); return promise; }

function getOrders(customer){

let promise = new Promise( function (resolve, reject){

// Emulate an async server call here setTimeout(function(){ let success = true; if (success){ resolve( `Found the order 123 for ${customer}`); // got order }else{ reject("Can't get orders"); } },1000);

} ); return promise; }

Promises

Page 42: TypeScript for Java Developers

function getCustomers(){

let promise = new Promise( function (resolve, reject){

console.log("Getting customers"); // Emulate an async server call here setTimeout(function(){ let success = true; if (success){ resolve( "John Smith"); // got customer }else{ reject("Can't get customers"); } },1000);

} ); return promise; }

function getOrders(customer){

let promise = new Promise( function (resolve, reject){

// Emulate an async server call here setTimeout(function(){ let success = true; if (success){ resolve( `Found the order 123 for ${customer}`); // got order }else{ reject("Can't get orders"); } },1000);

} ); return promise; }

getCustomers() .then(cust => console.log(cust)) .then(cust => getOrders(cust)) .then(order => console.log(order)) .catch(err => console.error(err));

Promises

Page 43: TypeScript for Java Developers

async/await• await - wait until the async code completes

• async - declare a function as asynchronous

async function getCustomersOrders(){ try { const customer = await getCustomers(); // no callbacks; no then console.log(`Got customer ${customer}`); const orders = await getOrders(customer); console.log(orders); } catch(err){ console.log(err); }

}

Page 44: TypeScript for Java Developers

Demo

node dist/async-await.js

Page 45: TypeScript for Java Developers

TypeScript Decorators (think Java annotations)

Page 46: TypeScript for Java Developers

What’s a Decorator?

• Decorator is a function with metadata about a class, property, method or a parameter

• Decorators start with the @-sign, e.g. @Component

Page 47: TypeScript for Java Developers

A sample Angular component with decorators

@Component({ selector: 'order-processor', template: ` Buying {{quantity}} shares} ` }) export class OrderComponent {

@Input() quantity: number;

}

Page 48: TypeScript for Java Developers

Creating your own class decorators

function Whoami (target){ console.log(`You are: \n ${target}`) }

@Whoami class Friend {

constructor(private name: string, private age: number){} }

Page 49: TypeScript for Java Developers

Using JavaScript libraries in the TypeScript code

Page 50: TypeScript for Java Developers

Type definition files

• Type definition files (*.d.ts) contain type declarations for JavaScript libraries and frameworks

• *.d.ts files are used by IDE for autocomplete

• TypeScript static analyzer uses *.d.ts files to report errors

Page 51: TypeScript for Java Developers

• npmjs.org has 3K+ *d.ts files

• https://www.npmjs.com/~types

• Install type definitions, e.g.: npm i @types/lodash --save-devnpm i @types/jquery --save-dev

Page 52: TypeScript for Java Developers

export declare class QueryList<T> { private _dirty; private _results; private _emitter; readonly changes: Observable<any>; readonly length: number; readonly first: T; readonly last: T; /** * See[Array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) */ map<U>(fn: (item: T, index: number, array: T[]) => U): U[]; /** * See * [Array.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) */ filter(fn: (item: T, index: number, array: T[]) => boolean): T[]; /** * See [Array.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find) */ find(fn: (item: T, index: number, array: T[]) => boolean): T | undefined; /** * See[Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) */ reduce<U>(fn: (prevValue: U, curValue: T, curIndex: number, array: T[]) => U, init: U): U; /** * See [Array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) */ forEach(fn: (item: T, index: number, array: T[]) => void): void; ... }

A sample type definitions file

Page 53: TypeScript for Java Developers

JS libraries in TypeScript apps. Approach 1.

• Add the required library scripts and CSS to index.html:

• Use the lib’s global variable in your TypeScript code:

Drawback: No TypeScript compiler’s errors; no autocomplete

Page 54: TypeScript for Java Developers

• Install the library npm i jqueryui --save

• If the type definition file exists, install itnpm i @types/jqueryui --save-dev

• In the Typescript code import this lib’s global objectimport $ from ‘jquery’;

• Add the required css to index.html

JS libraries in TypeScript apps. Approach 2.

Benefits: TypeScript compiler’s errors; autocomplete

Page 55: TypeScript for Java Developers

Create your own d.ts file

JS libraries in TypeScript apps. Approach 3.

Benefits: TypeScript compiler’s errors; autocomplete

function greeting(name) { console.log("hello " + name); }

hello.jsdeclare function greeting(name: string): void;

src/typings.d.ts

<script> src=“hello.js"></script>

index.html

app.component.ts

Page 56: TypeScript for Java Developers

Demo 1. cd src/hello-world-ts-jquery

2. npm i live-server -g 3. live-server

Page 57: TypeScript for Java Developers

Thank you!

• Training inquiries: [email protected]

• My blog:yakovfain.com