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!

7f408bc67dc9ae3b288ee92d16d3c4c2?s=128

Deepu K Sasidharan

November 13, 2018
Tweet

Transcript

  1. @deepu105 #Devoxx2018 By Deepu K Sasidharan, XebiaLabs November 13, 2018

    TypeScript: Complete
  2. @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
  3. @deepu105 #Devoxx2018 About XebiaLabs

  4. @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
  5. @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
  6. Why many Java developers hate frontend?

  7. @deepu105 #Devoxx2018 Frontend options 8 years ago =

  8. @deepu105 #Devoxx2018 The Rise of MV* Frameworks

  9. @deepu105 #Devoxx2018

  10. @deepu105 #Devoxx2018 “Yet Another Framework Syndrome”

  11. How to make Java developers like(love) JavaScript

  12. None
  13. @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
  14. I hate transpiling my code, but if have to do

    so I’ll do it with TypeScript
  15. @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
  16. @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
  17. Let’s get started!

  18. @deepu105 #Devoxx2018 Install TypeScript npm install -g typescript tsc -init

    tsc -w
  19. @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
  20. @deepu105 #Devoxx2018 Working with JS allowJs: Allow javascript files to

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

    */ let name; /** * @param {string} somebody - Somebody's name. */ function sayHello(somebody) { console.log('Hello ' + somebody); }
  22. @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
  23. @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’];
  24. @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); }
  25. @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;
  26. @deepu105 #Devoxx2018 Interfaces interface Person { name: string; age: number;

    address?: string; sayHi: Function; } let deepu: Person = { name: 'deepu', age: 32, sayHi: () => 'Hello there!' }
  27. @deepu105 #Devoxx2018 Interfaces interface Person { readonly phone: string; [key:

    string]: any; // excess property }
  28. @deepu105 #Devoxx2018 Function Interfaces interface AddFunction { (a: number, b:

    number): number } const add: AddFunction = (a, b) => { return a + b; }
  29. @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; } }
  30. @deepu105 #Devoxx2018 Extending Interfaces & Classes interface DevoxxAttendee extends Person

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

    string): string { return `Yo ${this.name}! ${msg}`; } };
  32. @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}`; } }
  33. @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}`; } }
  34. @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}`; } }
  35. @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');
  36. @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);
  37. @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}`); } }
  38. @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); } } }
  39. @deepu105 #Devoxx2018 Decorators @sealed class Greeter { greeting: string; constructor(message:

    string) { this.greeting = message; } @log greet() { return "Hello, " + this.greeting; } }
  40. @deepu105 #Devoxx2018 Decorators Methods Classes Properties Parameters Accessor

  41. @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]);
  42. @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
  43. @deepu105 #Devoxx2018 Intersection Types interface Runner { speed: number; run(distance:

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

    number): number; } interface Swimmer { speed: number; swim(distance: number): number; } type Person = Runner | Swimmer
  45. @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) }
  46. @deepu105 #Devoxx2018 Type Alias type GreeterAlias = Greeter type StringTuple2

    = [string, string]
  47. @deepu105 #Devoxx2018 Literal Types type Color = "red" | "blue"

    | "green"; type Binary = 1 | 0;
  48. @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']);
  49. @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; } }
  50. @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>;
  51. @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)
  52. @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
  53. @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
  54. @deepu105 #Devoxx2018 TsLint • Supports TypeScript & JavaScript • Tslint-eslint

    plugin • Tslint-React plugin • Tslint-config-prettier
  55. @deepu105 #Devoxx2018 Prettier • Supports TypeScript & JavaScript • Compatible

    with Tslint • Supports JSX, HTML, JSON etc
  56. @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
  57. @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
  58. @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
  59. @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
  60. Kickstarting Angular, Vue or React

  61. @deepu105 #Devoxx2018

  62. @deepu105 #Devoxx2018

  63. @deepu105 #Devoxx2018

  64. An optimal stack for Java developers

  65. @deepu105 #Devoxx2018 Want to learn more about JHipster? Come to

    our BOF tonight!
  66. Recommendations

  67. Learn the Language well, Frameworks are just tools to help

  68. https://www.typescriptlang.org/docs/handbook/ declaration-files/do-s-and-don-ts.html

  69. https://jhipster.tech @java_hipster Full Stack Development with JHipster • Amazon: https://goo.gl/k1NBAv

    • Packt: https://goo.gl/XvQLeN
  70. Thank you! Please rate the talk if you liked it!