typescript - silver bullet for the full-stack developers

32
TypeScript Write JavaScript the way you really want to Rūtenis Turčinas - [email protected]

Upload: rutenis-turcinas

Post on 28-Jul-2015

195 views

Category:

Software


2 download

TRANSCRIPT

Page 1: TypeScript - Silver Bullet for the Full-stack Developers

Rūtenis Turčinas - [email protected]

TypeScriptWrite JavaScript the way you really want to

Page 2: TypeScript - Silver Bullet for the Full-stack Developers

Author

Rūtenis Turčinas

[email protected]

https://github.com/rootis/jug-topic-1.git

Page 3: TypeScript - Silver Bullet for the Full-stack Developers

http://www.typescriptlang.org/Content/TypeScript Language Specification.pdf

Page 4: TypeScript - Silver Bullet for the Full-stack Developers

Agenda

Specification Integration

BuildClean Code

Page 5: TypeScript - Silver Bullet for the Full-stack Developers

Questions Thoughts Suggestions

Page 6: TypeScript - Silver Bullet for the Full-stack Developers

TypeScript. What is it? Do we need it?

TypeScript is a typed superset of JavaScript that compiles to plain JavaScript

Made by Microsoft

Open Source

Google had plans to release AtScript language, but desided to use TypeScript

Google and Microsoft are writing the Angular 2 framework in TypeScript

If your project uses JavaScript – TypeScript would be better

Page 7: TypeScript - Silver Bullet for the Full-stack Developers

Difference between other languages

CoffeeScript

More differences from JavaScript

You can not use plain JavaScript in *.coffee files

Dart

Has an own virtual machine

Browser manufacturers has no plans to support Dart in the near future

Page 8: TypeScript - Silver Bullet for the Full-stack Developers

How TypeScript works?

TypeScript file: test.ts

> tsc test.ts

Compiler makes test.js file

JavaScript file will be executed by browser

> tsc test.ts –sourcemap

Compiler makes the same test.js and one more file: test.js.map

Map file used to map *.js with *.ts file lines (to debug *.ts file instead of *.js)

Page 9: TypeScript - Silver Bullet for the Full-stack Developers

Hello World!

Page 10: TypeScript - Silver Bullet for the Full-stack Developers

Data types

boolean

number

string

Array

enum

any (try to avoid it)

void

Page 11: TypeScript - Silver Bullet for the Full-stack Developers

Statements, loops, functions

Simple variable assignment

var variableName: dataType = value;

Variable which data type is a function

var variableName: (paramName: dataType) => returnType = value;

Complex data type (do not use such data types)

var person: {name: string; surname: string; age: number, isMale: () => boolean} = null;

Page 12: TypeScript - Silver Bullet for the Full-stack Developers

Classes, interfaces, methods

interface UsersGroup {

getLanguage: () => string;

}

class Jug implements UsersGroup {

public getLanguage(): string { return "Java " + this.getJavaVersionTitle(); }

protected getJavaVersion(): number { return 1.7; }

private getJavaVersionTitle(): string { return "v" + this.getJavaVersion(); }

}

Page 13: TypeScript - Silver Bullet for the Full-stack Developers

Inheritance, overriding

class KaunasJug extends Jug {

protected getJavaVersion(): number { return 1.8; }

}

function printUsersGroupLanguage(usersGroup: UsersGroup): void { console.log(usersGroup.getLanguage());}

printUsersGroupLanguage(new Jug());printUsersGroupLanguage(new KaunasJug());

Page 14: TypeScript - Silver Bullet for the Full-stack Developers

Overloading

interface UsersGroup {

getLanguage(isUpperCase: boolean): string;

getLanguage(versionPrefix: string): string;

}

class KaunasJug implements UsersGroup {

getLanguage(property?: any): string { if (typeof property === 'boolean'){ return property ? "JAVA v1.8" : "Java v1.8"; } else if (typeof property === "string") { return "Java " + property + "1.8"; } }}

Page 15: TypeScript - Silver Bullet for the Full-stack Developers

Generics

function printProperty<T>(property: T): void { console.log(property);}

interface UserGroupArray<T extends Language> {

add(... languages: T[]): void;

printAllGroups(): void;

}

Page 16: TypeScript - Silver Bullet for the Full-stack Developers

Lambdas (use as little as possible)

class JavaUsersGroup {

private city: string;

constructor(city: string) { this.city = city; }

public printTitle1(): void { console.log(this.city + " JUG"); }

public printTitle2 = (): void => { console.log(this.city + " JUG"); };

}

Page 17: TypeScript - Silver Bullet for the Full-stack Developers

Modules

module usersGroup {

export class API {

public static init(data: any) { new ViewModel(data.someJSON); } }

class ViewModel {

constructor(jsonDataToLoad: string) { console.log('Loading...'); } }

class SomeInnerClass { }

}

Page 18: TypeScript - Silver Bullet for the Full-stack Developers

External libraries

Large API, difficult to use, hard to remember: actions, events, properties, sub modules...

For example: using selector you get jQuery object. You want to get it‘s specific child. Which method to use? Can you use the selector?

99% of developers would use google. More convenient to use ctrl+space and get the suggestion:

And if you try to do something ridiculous – the code won‘t compile:

Page 19: TypeScript - Silver Bullet for the Full-stack Developers

DefinetlyTyped - *.d.ts

Declaration file (*.d.ts) describes the library or module

> tsc --declaration file.ts

declare module usersGroup { class API { static init(data: any): void; }}

Page 20: TypeScript - Silver Bullet for the Full-stack Developers

Definition manager - tsd

LOTS of the *.d.ts files are here: https://github.com/borisyankov/DefinitelyTyped

But its hard to search and download... Is there a better way?

> npm install tsd –g

E.g. you want to use library lodash

Does it has lodash.d.ts file? Which version?

> tsd query lodash

Yes! It exists. We want to download lodash.d.ts file

> tsd install lodash –save

Using -save you wil store the information about installed *.d.ts in tsd.json

Page 21: TypeScript - Silver Bullet for the Full-stack Developers

Libraries without *.d.ts or legacy code

We are using super secret library...

In our project exists lots of legacy code...

But we still want to use TypeScript!

What to do?

Need to create declaration file for that library or legacy code (*.d.ts)

interface A_Static { new(m: any): A_Instance; st: string;}interface A_Instance { inst: number;}declare var A: A_Static;

Page 22: TypeScript - Silver Bullet for the Full-stack Developers

Dependency management tools

Internal modules

External modules: import $ = require('jquery');

commonJS

--module commonjs

AMD - requireJS

--module amd

Page 23: TypeScript - Silver Bullet for the Full-stack Developers

How to write TypeScript correctly?

TypeScript also can be terrible... if its plain JavaScript

How to prevent it?

Use simple rules:

Every variable, property, or function result – must have defined data type

Never use any data type

Use same clean code conventions like in server side

Page 24: TypeScript - Silver Bullet for the Full-stack Developers

Decouple modules

Most of the times JavaScript logic lives in one place

Large files tightly coupled in different ways

Impossible to do refactoring without bugs

How to solve it?

Decouple logic to different modules

Don‘t copy paste, just depend on some module

Define strict public API for integration with other modules

Page 25: TypeScript - Silver Bullet for the Full-stack Developers

Single responsibility for every item

One module/class/method should be responsible just for one thing

Currently we are trying one approach:

If length of file is more than 200 lines – we should rethink: is it only responsible for one thing?

If length of method is more than 5 lines – we should rethink: is it only responsible for one thing?

In our project:

97% of files have <= 200 lines

72% of methods have <= 5 lines (in 4 files: ~200, ~180, ~150, ~120)

Page 26: TypeScript - Silver Bullet for the Full-stack Developers

Hide as much as possible

Encapsulate code

Export only public API

One file - one module

Except – model entities

Much easier to refactor hidden code

Page 27: TypeScript - Silver Bullet for the Full-stack Developers

Try to keep code in first level

JAVA developers can feel much more convenient by having source code in first level

Less complexity

Easyer to understand and support

Page 28: TypeScript - Silver Bullet for the Full-stack Developers

OK. But my friend uses SunOS and VIM for editing source code. Can he..? Sure thing!

Page 29: TypeScript - Silver Bullet for the Full-stack Developers

One more thing… Production needs one file rather than 3

For development we want all files: *.ts, *.js, *.js.map

But for production we want only one: compressed *.js

You can configure build scripts

E.g. maven resource filtering

Page 30: TypeScript - Silver Bullet for the Full-stack Developers

Large project. Lots of code. How to test it?

Karma, Jasmine, Mocha, tsJunit, Qjunit, ...

Karma tests can be binded or decoupled from back end unit tests

Binded tests can be skipped together with java tests using –DskipTests

Decoupled tests can be skipped separate from java tests using custom properties

Page 31: TypeScript - Silver Bullet for the Full-stack Developers

Minuses in TypeScript

Eclipse IDE

After compiler version update your code may be broken...

Page 32: TypeScript - Silver Bullet for the Full-stack Developers

Questions Thoughts Suggestions