Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TypeScript: Complete

TypeScript: Complete

When moving to client-side technologies, TypeScript is a natural fit for everyone coming from strongly typed languages. Being a true superset of JavaScript, TypeScript adds a powerful type system and language features to help developers from other languages stay alert in a world where "undefined is not a function". In this three hour deep dive session, you will learn TypeScript from the ground up.

The course covers in depth language features, tooling and real world examples. After this deep dive course you will be able to do the following:

Use TypeScript in your regular JavaScript files, without any new syntax at all
Apply TypeScript's language features, from simple string types to Decorators and Generics
Set up TypeScript with Webpack
Set up tooling to check your code for errors
Set up the perfect TypeScript IDE/Editor
Create union, intersection, index, mapped and conditional types for advanced type checks and tooling support
Use TypeScript's type inference for React and Angular
Join us to make the web world a (type-) safer place!

Deepu K Sasidharan

November 13, 2018
Tweet

More Decks by Deepu K Sasidharan

Other Decks in Programming

Transcript

  1. @deepu105 #Devoxx2018 About Me Deepu K Sasidharan Javascript advocate &

    OSS aficionado Co-lead Senior product developer Robotics & Astronomy enthusiast https://www.packtpub.com/application-development/full-stack-development-jhipster
  2. @deepu105 #Devoxx2018 What about you? How many of you are

    Java developers? How many are web developers? Who likes JavaScript? Who likes TypeScript better? Are you a fan of: Angular React Vue.js
  3. @deepu105 #Devoxx2018 Today’s Agenda • Why many Java developers hate

    frontend development • All about TypeScript ◦ Use TypeScript in your regular JavaScript files, without any new syntax at all ◦ Apply TypeScript language features, from simple string types to Decorators and Generics ◦ Create union, intersection, index, mapped and conditional types for advanced type checks ◦ Set up build tooling ◦ Set up the TypeScript IDE/Editor ◦ Use type inference for React/Angular • Bootstrapping TypeScript projects
  4. @deepu105 #Devoxx2018 What is TypeScript A strict syntactical superset of

    JavaScript - upto ES2019(ES10) JavaScript that scales Optional static typing support Transpiles to JavaScript Maintained by Microsoft with major collaboration from Google Great editor and IDE support
  5. I hate transpiling my code, but if have to do

    so I’ll do it with TypeScript
  6. @deepu105 #Devoxx2018 Why TypeScript Type safety Great IDE support Easier

    refactoring Better linting and error identification Features from the Future Much better code style in React and Angular
  7. @deepu105 #Devoxx2018 TypeScript features at a Glance Static type checking,

    Type inference, Type aliasing Union, Intersection, Function and Hybrid types Generics, Decorators(a.k.a annotations), Mixins(a.k.a traits) Interface, Enum, Tuple support Private, optional, readonly properties JSX support, JS type checking and much more
  8. @deepu105 #Devoxx2018 All about TypeScript • Use TypeScript in your

    regular JavaScript files, without any new syntax at all • Apply TypeScript language features, from simple string types to Decorators and Generics • Create union, intersection, index, mapped and conditional types for advanced type checks • Set up build tooling • Set up the TypeScript IDE/Editor • Use type inference for React/Angular
  9. @deepu105 #Devoxx2018 Working with JS allowJs: Allow javascript files to

    be compiled checkJs: Report errors in .js files. // @ts-nocheck // @ts-check
  10. @deepu105 #Devoxx2018 Working with JSDoc type definitions /** @type {string}

    */ let name; /** * @param {string} somebody - Somebody's name. */ function sayHello(somebody) { console.log('Hello ' + somebody); }
  11. @deepu105 #Devoxx2018 All about TypeScript • Use TypeScript in your

    regular JavaScript files, without any new syntax at all • Apply TypeScript language features, from simple string types to Decorators and Generics • Create union, intersection, index, mapped and conditional types for advanced type checks • Set up build tooling • Set up the TypeScript IDE/Editor • Use type inference for React/Angular
  12. @deepu105 #Devoxx2018 Basic Types Boolean -> const foo: boolean =

    true; Number -> const foo: number = 10; String -> const foo: string = ‘hello’; Array -> const foo: string[] = [‘foo’, ‘bar’]; const foo: Array<string> = [‘foo’, ‘bar’];
  13. @deepu105 #Devoxx2018 Special Types Any -> const foo: any =

    { foo: 'bar' }; Object -> const foo: object = { foo: 'bar' }; Tuple -> const foo: [string, boolean] = ['foo', 10]; Void -> const foo: void = undefined; Undefined -> const foo: undefined = undefined; Null -> const foo: null = undefined; Never -> function error(message: string): never { throw new Error(message); }
  14. @deepu105 #Devoxx2018 Enum Types enum Color {Red, Green, Blue} let

    c: Color = Color.Green; enum Color {Red = 1, Green = 2, Blue = 4} let c: Color = Color.Green; enum Color {Red = "RED", Green = "GREEN", Blue = "BLUE"} let c: Color = Color.Green;
  15. @deepu105 #Devoxx2018 Interfaces interface Person { name: string; age: number;

    address?: string; sayHi: Function; } let deepu: Person = { name: 'deepu', age: 32, sayHi: () => 'Hello there!' }
  16. @deepu105 #Devoxx2018 Function Interfaces interface AddFunction { (a: number, b:

    number): number } const add: AddFunction = (a, b) => { return a + b; }
  17. @deepu105 #Devoxx2018 Implementing Interfaces class You implements Person { name:

    string; age: number; address?: string | undefined; sayHi = () => 'Hello there!'; constructor(name: string, age: number, address?: string){ this.name = name; this.age = age; this.address = address; } }
  18. @deepu105 #Devoxx2018 Extending Interfaces & Classes interface DevoxxAttendee extends Person

    { isHip: boolean; } interface DevoxxAttendee extends You { isHip: boolean; }
  19. @deepu105 #Devoxx2018 Class inheritance class Hipster extends You { beHip(msg:

    string): string { return `Yo ${this.name}! ${msg}`; } };
  20. @deepu105 #Devoxx2018 Class Modifiers class Greeter { private greeting: string;

    protected name: string = `greeter`; readonly foo: string = `bar`; constructor(message: string){ this.greeting = message } public greet(){ return `Hello ${this.greeting} from ${this.name}`; } }
  21. @deepu105 #Devoxx2018 Static Properties class Greeter { static greeter: string

    = `foo`; private greeting: string; constructor(message: string){ this.greeting = message } public greet(){ return `Hello ${this.greeting} from ${Greeter.greeter}`; } }
  22. @deepu105 #Devoxx2018 Abstract classes abstract class Greeter { static greeter:

    string = `foo`; private greeting: string; constructor(message: string){ this.greeting = message } public greet(){ return `Hello ${this.greeting} from ${Greeter.greeter}`; } }
  23. @deepu105 #Devoxx2018 Function overloading function add(x: string, y: string): string;

    function add(x: number, y: number): number; function add(x: any, y: any): any { if (typeof x == 'string' && typeof y == 'string') { return `${x}:${y}`; } else { return x + y; } } add(10, 10); add('10', '10');
  24. @deepu105 #Devoxx2018 Generics class Greeter<T> { private greeting: T; constructor(message:

    T){ this.greeting = message } public greet(){ return `Hello ${this.greeting}`; } } const greeter = new Greeter<string>('world'); const greeter2 = new Greeter<number>(10);
  25. @deepu105 #Devoxx2018 Modules import { color } from `color`; export

    class Greeter<T> { private greeting: T; constructor(message: T){ this.greeting = message } public greet(){ return color.red(`Hello ${this.greeting}`); } }
  26. @deepu105 #Devoxx2018 Namespace namespace Validation { export interface StringValidator {

    isAcceptable(s: string): boolean; } const lettersRegexp = /^[A-Za-z]+$/; const numberRegexp = /^[0-9]+$/; export class LettersOnlyValidator implements StringValidator { isAcceptable(s: string) { return lettersRegexp.test(s); } } export class ZipCodeValidator implements StringValidator { isAcceptable(s: string) { return s.length === 5 && numberRegexp.test(s); } } }
  27. @deepu105 #Devoxx2018 Decorators @sealed class Greeter { greeting: string; constructor(message:

    string) { this.greeting = message; } @log greet() { return "Hello, " + this.greeting; } }
  28. @deepu105 #Devoxx2018 Mixins class Runner { speed = 0; run(distance:

    number) { return distance * this.speed * 2; } } class Person implements Runner { speed = 0; setSpeed(speed: number) { this.speed = speed; } run(distance: number): number { return 0; } } applyMixins(Person, [Runne]);
  29. @deepu105 #Devoxx2018 All about TypeScript • Use TypeScript in your

    regular JavaScript files, without any new syntax at all • Apply TypeScript language features, from simple string types to Decorators and Generics • Create union, intersection, index, mapped and conditional types for advanced type checks • Set up build tooling • Set up the TypeScript IDE/Editor • Use type inference for React/Angular
  30. @deepu105 #Devoxx2018 Intersection Types interface Runner { speed: number; run(distance:

    number): number; } interface Swimmer { speed: number; swim(distance: number): number; } type Person = Runner & Swimmer
  31. @deepu105 #Devoxx2018 Union Types interface Runner { speed: number; run(distance:

    number): number; } interface Swimmer { speed: number; swim(distance: number): number; } type Person = Runner | Swimmer
  32. @deepu105 #Devoxx2018 Type Guards function isSwimmer(person: Runner | Swimmer): person

    is Swimmer { return (<Swimmer>person).swim !== undefined; } function isRunner(person: Runner | Swimmer): person is Runner { return (<Runner>person).run !== undefined; } if (isSwimmer(person)) { person.swim(10) } if (isRunner(person)) { person.run(10) }
  33. @deepu105 #Devoxx2018 Index Types function pluck<T, K extends keyof T>(o:

    T, names: K[]): T[K][] { return names.map(n => o[n]); } interface Person { name: string; age: number; } let person: Person = { name: 'Jarid', age: 35 }; let strings: string[] = pluck(person, ['name']);
  34. @deepu105 #Devoxx2018 This Types class BasicCalculator { public constructor(protected value:

    number = 0) {} public currentValue(): number { return this.value; } public add(operand: number): this { this.value += operand; return this; } public multiply(operand: number): this { this.value *= operand; return this; } }
  35. @deepu105 #Devoxx2018 Mapped Types type Readonly<T> = { readonly [P

    in keyof T]: T[P]; } type Partial<T> = { [P in keyof T]?: T[P]; } type PersonPartial = Partial<Person>; type ReadonlyPerson = Readonly<Person>;
  36. @deepu105 #Devoxx2018 Conditional Types declare function f<T extends boolean>(x: T):

    T extends true ? string : number; // Type is ‘string | number’ let x = f(Math.random() < 0.5)
  37. @deepu105 #Devoxx2018 All about TypeScript • Use TypeScript in your

    regular JavaScript files, without any new syntax at all • Apply TypeScript language features, from simple string types to Decorators and Generics • Create union, intersection, index, mapped and conditional types for advanced type checks • Set up build tooling • Set up the TypeScript IDE/Editor • Use type inference for React/Angular
  38. @deepu105 #Devoxx2018 Webpack • Webpack • Webpack CLI • Webpack

    Dev Server • Fork-ts-checker-webpack-plugin • Thread-loader • Cache-loader • Ts-loader • Source-map-loader • Tslint-loader • Terser-webpack-plugin • Webpack • Webpack CLI • Webpack Dev Server • Awesome-typescript-loader • Source-map-loader • Tslint-loader • Terser-webpack-plugin
  39. @deepu105 #Devoxx2018 TsLint • Supports TypeScript & JavaScript • Tslint-eslint

    plugin • Tslint-React plugin • Tslint-config-prettier
  40. @deepu105 #Devoxx2018 All about TypeScript • Use TypeScript in your

    regular JavaScript files, without any new syntax at all • Apply TypeScript language features, from simple string types to Decorators and Generics • Create union, intersection, index, mapped and conditional types for advanced type checks • Set up build tooling • Set up the TypeScript IDE/Editor • Use type inference for React/Angular
  41. @deepu105 #Devoxx2018 VsCode • Best TypeScript support among available options

    • Written in TypeScript and hence supports it natively • Plugin for Tslint • Lot of TypeScript utility plugins, like TypeScript Hero
  42. @deepu105 #Devoxx2018 IntelliJ Idea • Very good TypeScript support through

    plugin • Has support for Tslint • Only available in Ultimate edition https://www.jetbrains.com/help/idea/typescript-support.html
  43. @deepu105 #Devoxx2018 All about TypeScript • Use TypeScript in your

    regular JavaScript files, without any new syntax at all • Apply TypeScript language features, from simple string types to Decorators and Generics • Create union, intersection, index, mapped and conditional types for advanced type checks • Set up build tooling • Set up the TypeScript IDE/Editor • Use type inference for React/Angular