Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

XMLHttpRequest

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

string number undefined null { x: number, y: number } string[] [ string, number ] type Hoge = { x: number, y: number };

Slide 7

Slide 7 text

& type HogeProps = { x: number }; type HugaProps = { y: number }; // 2 const props: HogeProps & HugaProps; const props: { x: number, y: number }; & structural typing props

Slide 8

Slide 8 text

| type Hoge = { // string object hoge: string | { id: string, name: string }; }; // undefined const a: string | undefined; const b: { name?: string; // name string | undefined }; | undefined name?

Slide 9

Slide 9 text

// c name, id const c: { name: string } | { id: string }; // c // name, id const d: { name?: string; id?: string }; c

Slide 10

Slide 10 text

| let a: "Hoge" | "Huga"; a = "Piyo"; // Compile error literal type

Slide 11

Slide 11 text

let a: string | undefined; if (typeof(a) !== "undefined") { // a: string // (string | undefined) - undefined == string } else { // a: undefined // (string | undefined) - !(undefined) == undefined }

Slide 12

Slide 12 text

never never const a: string; if (typeof(a) !== "string") { // string - string == never a.substring(0, 1); // Compile error }

Slide 13

Slide 13 text

type MyEnum = "Hoge" | "Huga"; // JSON MyEnum // switch(JSON.parse(`"INVALID VALUE"`) as MyEnum) { case "Hoge": return something; case "Huga": return something; default: throw new Error(a); } | "Piyo"

Slide 14

Slide 14 text

type MyEnum = "Hoge" | "Huga" | "Piyo"; // JSON MyEnum // switch(JSON.parse(`"INVALID VALUE"`) as MyEnum) { case "Hoge": return something; case "Huga": return something; default: throw new Error(a); // "Piyo" ... } | "Piyo" case "Piyo" default default "INVALID VALUE"

Slide 15

Slide 15 text

/** enum */ class InvalidMyEnumError extends Error { construct(value: never) { // = never super(`Invalid value: ${value}`); } } type MyEnum = "Hoge" | "Huga" | "Piyo"; switch(JSON.parse(`"INVALID VALUE"`) as MyEnum) { case "Hoge": return something; case "Huga": return something; default: // case value: never // value: never // Type '"Piyo"' is not assignable to type 'never'. throw new InvalidMyEnumError(value); }

Slide 16

Slide 16 text

const b: { name: string, address: string } | { id: string }; if (typeof(b.name) === "string") { // { name: "hoge", id: "hoge" } // { id: string } if // b // { name: string, address: string } // } { id: string }

Slide 17

Slide 17 text

const b: { name : string, id?: never , address: string } | { name?: never , id : string }; if (typeof(b.name) === "string") { // name string undefined // b: { name: string } } name?: never

Slide 18

Slide 18 text

| & never

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

// 2 const x: Readonly<{ name: string }>; const x: { readonly name: string }; readonly Readonly Readonly Readonly T

Slide 21

Slide 21 text

const a: readonly string[]; a[0] = " "; // Compile error const b = a; b[0] = " "; // Compile error // readonly const c: string[] = a; // Compile error

Slide 22

Slide 22 text

readonly const

Slide 23

Slide 23 text

Readonly type Readonly = { readonly [P in keyof T]: T[P]; };

Slide 24

Slide 24 text

keyof type Readonly = { readonly [P in keyof T]: T[P]; }; keyof T T keyof { name: string, age: number } "name" | "age"

Slide 25

Slide 25 text

in type Readonly = { readonly [P in keyof T]: T[P]; }; [ in ]: type Hoge = { [P in "name" | "age"]: Error; }; type Hoge = { name: Error; age: Error; };

Slide 26

Slide 26 text

T[ ] type Readonly = { readonly [P in keyof T]: T[P]; }; T[ ] type T = { name: string; age: number; }; type Hoge = { readonly name: T["name"]; readonly age: T["age"]; }; type Hoge = { readonly name: string; readonly age: number; };

Slide 27

Slide 27 text

type Readonly = { readonly [P in keyof T]: T[P]; }; keyof T "name" | "age" [P in key of T]: T[P] T["name"] T["age"] readonly

Slide 28

Slide 28 text

// T Map key, value DeepReadonly ReadonlyMap type DeepReadonly = T extends Map ? ReadonlyMap, DeepReadonly> : ... // : DeepReadonly TS infer K V

Slide 29

Slide 29 text

Compile-time emulation of a 4-bit Virtual Machine using TypeScript's Type System

Slide 30

Slide 30 text

tsconfig.json

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

const hoge = [1, 2]; any any[] number[] [ number, number ] [ 1, 2 ] [ number, number... ]

Slide 33

Slide 33 text

const hoge = [1, 2]; any [1,2] " " undefined null any[] [1,2] [] [ " ", null ] number[] [1,2] [] [4,3,2,1,-0] [ number, number ] [1,2] [1024,-3.14] [ 1, 2 ] [1,2]

Slide 34

Slide 34 text

number[] const hoge /* :number[] */ = [1, 2]; hoge.push(3); // Valid hoge[0] = 2.71; // Valid hoge[0] = " "; // INVALID [1, 2]

Slide 35

Slide 35 text

const myEnumFoo = 0; const myEnumBar = 1; type MyEnum = typeof myEnumFoo | typeof myEnumBar; // 0 | 1 // hoge readonly [1, 2] const hoge = [1, 2] as const; // const test0: MyEnum = hoge[0]; // Valid (hoge[0] 1 ) const test1: MyEnum = hoge[1]; // INVALID (hoge[1] 2 ) hoge[0] 1

Slide 36

Slide 36 text

TypeScript

Slide 37

Slide 37 text

TypeScript node_modules/**/*.ts transpile only

Slide 38

Slide 38 text

- -