Slide 1

Slide 1 text

Paris TypeScript January 8th 2018

Slide 2

Slide 2 text

Premier Field Engineer @spontoreau In ❤️ with Co-organizer

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

type MyFunctionType = { (value: string): boolean; }; // or interface MyFunctionInterface { (value: string): boolean; };

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

let total = 0; let add = (nb: number) => total += nb; add(1); // total equals 1 add(2); // total equals 3 add(3); // total equals 6

Slide 9

Slide 9 text

let total = 0; let isNegative = () => total < 0; let result1 = isNegative(); // false total--; let result2 = isNegative(); // true

Slide 10

Slide 10 text

let add = (nb1: number, nb2: number) => nb1 + nb2; let result1 = add(1, 2); // result1 equals 3 let result2 = add(result1, 3); // result2 equals 6 let result3 = add(result2, 4); // result3 equals 10 let result4 = add(result2, 4); // result4 equals 10

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

const total = 0; const add = (nb: number) => total += nb; type Person = { firstName: string, lastName: string }; const p: Person = { firstName: "Sylvain", lastName: "Pontoreau" }; p.firstName = "anotherFirstName";

Slide 13

Slide 13 text

type Person = Readonly<{ firstName: string, lastName: string }>; const p: Person = { firstName: "Sylvain", lastName: "Pontoreau" }; p.firstName = "anotherFirstName";

Slide 14

Slide 14 text

const personArray: ReadonlyArray = [{ firstName: "Sylvain", lastName: "Pontoreau" }, { firstName: "Bill", lastName: "Gates" }]; personArray.push({ firstName: "Satya", lastName: "Nadella" });

Slide 15

Slide 15 text

type Person = Readonly<{ firstName: string, lastName: string }>; const person: Person = { firstName: "Sylvain", lastName: "Pontoreau" }; const clone: Person = { ...person, firstName: "anotherFirstName" }; https://github.com/facebook/immutable-js

Slide 16

Slide 16 text

const sum = (numbers: ReadonlyArray) => { let result = 0; numbers.forEach((n: number) => { result += n; }); return result; }; const result = sum([1, 2, 3, 4]); // result equals 10

Slide 17

Slide 17 text

const sum = (numbers: ReadonlyArray): number => { return numbers.length ? numbers[0] + sum(numbers.slice(1)) : 0; }; const result = sum([1, 2, 3, 4]); // result equals 10

Slide 18

Slide 18 text

const handleCase1 = () => "Returns a result for case 1"; const handleCase42 = () => "Returns a result for case 42"; const handleDefaultCase = () => "Returns a default result"; const valueToCheck = Math.random() * 42; const result = ((check) => { switch(check) { case 1: return handleCase1(); case 42: return handleCase42(); default: return handleDefaultCase(); } })(valueToCheck);

Slide 19

Slide 19 text

type Condition = { (value: TValue): boolean; }; type Execute = { (value: TValue): TResult; }; type Pattern = { condition: Condition, execute: Execute }; const when = ( condition: Condition, execute: Execute) => { return { condition, execute }; };

Slide 20

Slide 20 text

const match = function( value: TValue, defaultExecute: Execute, ...patterns: Pattern[]): TResult { if (patterns.length > 0) { const when = patterns[0]; return !when.condition(value) ? match( value, defaultExecute, ... patterns.slice(1)) : when.execute(value); } else { return defaultExecute(value); } }

Slide 21

Slide 21 text

const handleCase1 = () => "Returns a result for case 1"; const handleCase42 = () => "Returns a result for case 42"; const handleDefaultCase = () => "Returns a default result"; const valueToCheck = Math.random() * 42; const result = match( valueToCheck, handleDefaultCase, when((v) => v === 1, handleCase1), when((v) => v === 42, handleCase42) );

Slide 22

Slide 22 text

const result = case (valueToCheck) { when 1 -> { return handleCase1(); } when 42 -> { return handleCase42(); } when value if (value !== 1 && value !== 42) -> { return handleDefaultCase(); } };

Slide 23

Slide 23 text

const post = (url: string) => { return (value: TValue) => { return fetch(url, { headers: { "Accept": "application/json", "Content-Type": "application/json", }, method: "POST", body: JSON.stringify(value), }); }; }; type Person = { firstName: string, lastName: string, } const postPerson = post("url"); postPerson({ firstName: "Sylvain", lastName: "Pontoreau", }).then((response) => { // Do something }); const promise = post("url")(person);

Slide 24

Slide 24 text

interface FormatResult { (n: number): string; } interface Square { (n: number): number } const formatResult = (n: number) => `Result is ${ n }`; const square = (n: number) => n * n; const pipe = (format: FormatResult, square: Square) => { return (n: number) => format(square(n)) }; const result = pipe(formatResult, square)(42);

Slide 25

Slide 25 text

declare global { interface Object { pipe(this: T, next:(value:T) => TResult): TResult; } } Object.prototype.pipe = function(this:T, next:(value:T) => TResult): TResult { return next(this); }; const nb = Math.random() * 100; const pipeResult = nb.pipe(square).pipe(formatResult);

Slide 26

Slide 26 text

const nb = Math.random() * 100; const result = nb |> square |> formatResult;

Slide 27

Slide 27 text

const compose = ( function1: (value: TFirstReturn) => TSecondReturn, function2: (value: TValue) => TFirstReturn ) => (value: TValue) => function1(function2(value)); const kebabToSnakeCase = (s: string) => s.replace("-", "_"); const toUpper = (s: string) => s.toUpperCase(); const toScreamingSnakeCase = compose(kebabToSnakeCase, toUpper); const result = toScreamingSnakeCase("kebab-case"); // result: KEBAB_CASE

Slide 28

Slide 28 text

class Composition { private constructor(private readonly func : (x : TValue) => TResult) { } static compose(func : (x : TValue) => TResult) { return new Composition(func); } compose(f : (x : TNextValue) => TValue) : Composition { return new Composition(x => this.func(f(x))) } execute(value: TValue) : TResult { return this.func(value); } } const result = Composition.compose(kebabToSnakeCase).compose(toUpper).execute("kebab-case");

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content