Slide 1

Slide 1 text

܅͚ͩͷΦϦδφϧ async / await Λ࡞Ζ͏ susisu 2025-05-24 TSKaigi 2025

Slide 2

Slide 2 text

݁࿦: TypeScript ໘ന͍ ؾָʹฉ͍͍ͯͩ͘͞

Slide 3

Slide 3 text

• id:susisu / @susisu / @susisu2413 • גࣜձࣾ͸ͯͳ
 Web ΞϓϦέʔγϣϯΤϯδχΞ • TypeScript ͷݶքΛ߈ΊΔͷ͕झຯͰ͢ ͜Μʹͪ͸

Slide 4

Slide 4 text

ϦαʔνͳͲͷΠϯλϏϡʔ݁Ռͷ෼ੳϓϩηεΛࢧԉ͢Δൃ࿩෼ੳιϦϡʔγϣϯ TypeScript / Next.js / Prisma Ͱ։ൃ͍ͯ͠·͢

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

ࠓ೔࿩͢͜ͱ ᶃ async / await Λ δΣωϨʔλͰ࠶࣮૷ ᶄ TypeScript ʹΑΔܕ෇͚ ᶅ Ԡ༻ͦͷ 1: Result ܕ ᶆ Ԡ༻ͦͷ 2: ΤϑΣΫτ JS TS ᶃ ᶄ ᶅ ᶆ async / await δΣωϨʔλ Result ܕ ΤϑΣΫτ

Slide 7

Slide 7 text

ࠓ೔࿩͢͜ͱ ᶃ async / await Λ δΣωϨʔλͰ࠶࣮૷ ᶄ TypeScript ʹΑΔܕ෇͚ ᶅ Ԡ༻ͦͷ 1: Result ܕ ᶆ Ԡ༻ͦͷ 2: ΤϑΣΫτ JS ᶃ async / await δΣωϨʔλ

Slide 8

Slide 8 text

ࠓ೔࿩͢͜ͱ ᶃ async / await Λ δΣωϨʔλͰ࠶࣮૷ ᶄ TypeScript ʹΑΔܕ෇͚ ᶅ Ԡ༻ͦͷ 1: Result ܕ ᶆ Ԡ༻ͦͷ 2: ΤϑΣΫτ JS TS ᶃ ᶄ async / await δΣωϨʔλ

Slide 9

Slide 9 text

ࠓ೔࿩͢͜ͱ ᶃ async / await Λ δΣωϨʔλͰ࠶࣮૷ ᶄ TypeScript ʹΑΔܕ෇͚ ᶅ Ԡ༻ͦͷ 1: Result ܕ ᶆ Ԡ༻ͦͷ 2: ΤϑΣΫτ JS TS ᶃ ᶄ ᶅ async / await δΣωϨʔλ Result ܕ

Slide 10

Slide 10 text

ࠓ೔࿩͢͜ͱ ᶃ async / await Λ δΣωϨʔλͰ࠶࣮૷ ᶄ TypeScript ʹΑΔܕ෇͚ ᶅ Ԡ༻ͦͷ 1: Result ܕ ᶆ Ԡ༻ͦͷ 2: ΤϑΣΫτ JS TS ᶃ ᶄ ᶅ ᶆ async / await δΣωϨʔλ Result ܕ ΤϑΣΫτ

Slide 11

Slide 11 text

ᶃ async / await Λ δΣωϨʔλͰ࠶࣮૷

Slide 12

Slide 12 text

async / await • Promise Λ࢖ͬͨίʔυΛݟ௨͠ྑ͘ॻͨ͘Ίʹ async / await ͸ෆՄܽ // before doX().then((x) => doY(x).then((y) => doZ(y).then((z) => // ... ) ) ); // after const x = await doX(); const y = await doY(x); const z = await doZ(y); // ...

Slide 13

Slide 13 text

async / await ͷྺ࢙ • Promise ͷඪ४Խ͔Β async / await ͷඪ४Խ·Ͱ͸λΠϜϥά͕͋ͬͨ • Promise: ES2015 • async / await: ES2017 • ਓʑ͸τϥϯεύΠϥΛ࢖ͬͯ async / await ΛઌऔΓ͍ͯͨ͠ • Babel, TypeScript • ͋Δ͍͸δΣωϨʔλΛ࢖ͬͯ async / await ͬΆ͍ίʔυΛॻ͍͍ͯͨ • tj/co, Koa

Slide 14

Slide 14 text

δΣωϨʔλ • ES2015 Ͱඪ४Խ͞Εͨݴޠػೳ • δΣωϨʔλؔ਺ function* ͱ yield ࣜͰΠςϨʔλΛखଓ͖తʹهड़Ͱ͖Δ • ͜Ε͸தஅɾ࠶։Ͱ͖Δܭࢉ (ίϧʔνϯ) ͱͯ͠ݟΔ͜ͱ΋Ͱ͖Δ function* range(from, to, step = 1) { for (let n = from; n < to; n += step) { yield n; } }

Slide 15

Slide 15 text

δΣωϨʔλؔ਺ͷதஅɾ࠶։ function* myFunc() { const x = yield "X"; const y = yield "Y"; return x + y; }

Slide 16

Slide 16 text

δΣωϨʔλؔ਺ͷதஅɾ࠶։ function* myFunc() { const x = yield "X"; const y = yield "Y"; return x + y; } const gen = myFunc(); ← ·࣮ͩߦ͞Ε͍ͯͳ͍

Slide 17

Slide 17 text

δΣωϨʔλؔ਺ͷதஅɾ࠶։ function* myFunc() { const x = yield "X"; const y = yield "Y"; return x + y; } const gen = myFunc(); gen.next(); // { done: false, value: "X" } ← yield Ͱதஅ

Slide 18

Slide 18 text

δΣωϨʔλؔ਺ͷதஅɾ࠶։ function* myFunc() { const x = yield "X"; // x = 1 const y = yield "Y"; return x + y; } const gen = myFunc(); gen.next(); // { done: false, value: "X" } gen.next(1); // { done: false, value: "Y" } ← ࠶։͞Εͯ;ͨͨͼ yield Ͱதஅ

Slide 19

Slide 19 text

δΣωϨʔλؔ਺ͷதஅɾ࠶։ function* myFunc() { const x = yield "X"; // x = 1 const y = yield "Y"; // y = 2 return x + y; } const gen = myFunc(); gen.next(); // { done: false, value: "X" } gen.next(1); // { done: false, value: "Y" } gen.next(2); // { done: true, value: 3 } ← return Ͱऴྃ

Slide 20

Slide 20 text

async / await ͷ࠶࣮૷ • δΣωϨʔλؔ਺ͷதஅɾ࠶։Λར༻͢Ε͹ɺasync / await Λ࠶ݱͰ͖ͦ͏ • await ͸ Promise ͷ׬ྃ·Ͱؔ਺ͷ࣮ߦΛதஅ͢Δ͜ͱʹ΄͔ͳΒͳ͍ • جຊతͳΞΠσΞ: • Promise Λ yield ͯ͠ܭࢉΛதஅ • Promise ͕׬ྃͨ͠ΒܭࢉΛ࠶։

Slide 21

Slide 21 text

async / await ͷ࠶࣮૷ async function myFunc() { const x = await doX(); const y = await doY(x); return y; } const promise = myFunc(); function* myFunc() { const x = yield doX(); const y = yield doY(x); return y; } const promise = run(myFunc());

Slide 22

Slide 22 text

async / await ͷ࠶࣮૷ async function myFunc() { const x = await doX(); const y = await doY(x); return y; } const promise = myFunc(); function* myFunc() { const x = yield doX(); const y = yield doY(x); return y; } const promise = run(myFunc()); → ͍͍ײ͡ʹδΣωϨʔλΛ࣮ߦͯ͘͠ΕΔؔ਺ run() Λ࣮૷͢Δ

Slide 23

Slide 23 text

async / await ͷ࠶࣮૷ • εϥΠυதͷίʔυͷ׬શ൛͸ҎԼͷϦϙδτϦʹ͋Γ·͢ • https://github.com/susisu/tskaigi2025

Slide 24

Slide 24 text

run() ͷ࣮૷ (1/3) function run(comp) { function onFulfilled(value) { // Promise 成功時の処理 let res; try { res = comp.next(value); // 計算を再開 } catch (e) { return Promise.reject(e); // throw } if (res.done) return Promise.resolve(res.value); // return return res.value.then(onFulfilled, onRejected); // yield }

Slide 25

Slide 25 text

run() ͷ࣮૷ (1/3) function run(comp) { function onFulfilled(value) { // Promise 成功時の処理 let res; try { res = comp.next(value); // 計算を再開 } catch (e) { return Promise.reject(e); // throw } if (res.done) return Promise.resolve(res.value); // return return res.value.then(onFulfilled, onRejected); // yield }

Slide 26

Slide 26 text

run() ͷ࣮૷ (1/3) function run(comp) { function onFulfilled(value) { // Promise 成功時の処理 let res; try { res = comp.next(value); // 計算を再開 } catch (e) { return Promise.reject(e); // throw } if (res.done) return Promise.resolve(res.value); // return return res.value.then(onFulfilled, onRejected); // yield } δΣωϨʔλؔ਺͔ΒͷԠ౴͸ throw, return, yield ͷ 3 ௨Γ͕͋ΓಘΔ

Slide 27

Slide 27 text

run() ͷ࣮૷ (2/3) function onRejected(error) { // Promise 失敗時の処理 let res; try { res = comp.throw(error); // 計算を再開 } catch (e) { return Promise.reject(e); // throw } if (res.done) return Promise.resolve(res.value); // return return res.value.then(onFulfilled, onRejected); // yield }

Slide 28

Slide 28 text

run() ͷ࣮૷ (2/3) function onRejected(error) { // Promise 失敗時の処理 let res; try { res = comp.throw(error); // 計算を再開 } catch (e) { return Promise.reject(e); // throw } if (res.done) return Promise.resolve(res.value); // return return res.value.then(onFulfilled, onRejected); // yield } onFul fi lled ͱͷࠩ෼͸͚ͩ͜͜ yield ͷՕॴͰ throw ͢Δ

Slide 29

Slide 29 text

run() ͷ࣮૷ (3/3) // 計算を先頭から開始 return onFulfilled(); } function* myFunc() { const x = yield doX(); const y = yield doY(x); return y; } const promise = run(myFunc());

Slide 30

Slide 30 text

͜͜·Ͱͷ·ͱΊ • δΣωϨʔλ͸தஅɾ࠶։Ͱ͖Δܭࢉͱͯ͠ݟΔ͜ͱ͕Ͱ͖Δ • ͜ΕΛ࢖͑͹ async / await ૬౰ͷ΋ͷΛ࠶࣮૷Ͱ͖Δ • ͜͜·Ͱ͸શͯ JavaScript ͷ࿩ • ࣮͸͜ͷ··ͩͱ yield ࣜʹ͏·͘ܕ͕෇͚ΒΕͳ͍ʂ

Slide 31

Slide 31 text

ᶄ TypeScript ʹΑΔܕ෇͚

Slide 32

Slide 32 text

TypeScript ʹΑΔܕ෇͚ function* myFunc() { const x = yield doX(); const y = yield doY(x); return y; } const promise = run(myFunc()); • yield ࣜʹܕ͕෇͚ΒΕΔঢ়ଶΛ໨ࢦ͢ • (run() ͷ࣮૷಺෦ʹର͢Δܕ෇͚͸໨ࢦ͞ͳ͍)

Slide 33

Slide 33 text

yield ࣜʹର͢Δܕ෇͚ͷน • yield ࣜʹܕΛ෇͚Δʹ͋ͨͬͯ͸ 2 ͭͷน͕͋Δ 1. δΣωϨʔλ͕ඞܾͣ·ͬͨํ๏Ͱ࣮ߦ͞ΕΔอূ͕ͳ͍ 2. yield ࣜ͝ͱʹҟͳΔܕ͕෇͚ΒΕͳ͍

Slide 34

Slide 34 text

1. ܾ·ͬͨํ๏Ͱ࣮ߦ͞ΕΔอূ͕ͳ͍ function* myFunc() { const x = yield doX(); const y = yield doY(x); return y; } const promise = run(myFunc()); // run() を使っているなら OK const what = [...myFunc()]; // そうでないならダメ

Slide 35

Slide 35 text

1. ܾ·ͬͨํ๏Ͱ࣮ߦ͞ΕΔอূ͕ͳ͍ function* myFunc() { const x = yield doX(); const y = yield doY(x); return y; } const promise = run(myFunc()); // run() を使っているなら OK const what = [...myFunc()]; // そうでないならダメ → ن໿ͱ͍͏͜ͱʹͯ͠͠·͏... • ໓ଟʹ΍Βͳ͍Ͱ͠ΐ͏ / ඞཁʹͳͬͨΒ Linter Λ࡞Ζ͏

Slide 36

Slide 36 text

2. yield ࣜ͝ͱʹҟͳΔܕ͕෇͚ΒΕͳ͍ • δΣωϨʔλͷܕ Generator • T ... yield a ͷ a ͷܕ • TReturn ... return a ͷ a ͷܕ • TNext ... gen.next(b) ͷ b ͷܕ = yield a ͷܕ function* myFunc(): Generator { // ... }

Slide 37

Slide 37 text

2. yield ࣜ͝ͱʹҟͳΔܕ͕෇͚ΒΕͳ͍ • yield ࣜͷܕ = TNext ͕ 1 छྨ͔͠ͳ͍ • ҎԼͷίʔυͰݴ͏ͱ x ͱ y ͷܕ͕ಉ͡ʹͳͬͯ͠·͏ function* myFunc(): Generator { const x = yield doX(); // x: TNext const y = yield doY(x); // y: TNext return y; }

Slide 38

Slide 38 text

• yield ࣜͷܕ = TNext ͕ 1 छྨ͔͠ͳ͍ • ҎԼͷίʔυͰݴ͏ͱ x ͱ y ͷܕ͕ಉ͡ʹͳͬͯ͠·͏ → yield* ࣜΛ࢖͏ function* myFunc(): Generator { const x = yield doX(); // x: TNext const y = yield doY(x); // y: TNext return y; } 2. yield ࣜ͝ͱʹҟͳΔܕ͕෇͚ΒΕͳ͍

Slide 39

Slide 39 text

yield* ࣜΛ࢖͏ • yield* iter ͸ Iterable ΛδΣωϨʔλؔ਺಺Ͱల։͢Δߏจ • yield* iter ͷܕ͸ iter ʹԠܾͯ͡·Δ • iter ͷܕ͕ Iterable ͷͱ͖ɺyield* iter ͷܕ͸ SReturn • → ࣜ͝ͱʹҟͳΔܕΛ࣋ͯΔ

Slide 40

Slide 40 text

yield* ࣜΛ࢖͏ • yield* ࣜʹ༩͑Δ஋͸ Iterable Ͱ͋Δඞཁ͕͋Δ • ୯७ʹ yield a Λ yield* a ͷΑ͏ʹஔ͖׵͑Δ͜ͱ͸Ͱ͖ͳ͍ • yield* toIterable(a) ͷΑ͏ʹ Iterable ʹม׵͠ͳ͍ͱ͍͚ͳ͍ • ม׵͸ͳΜͰ΋ྑ͍Θ͚Ͱ͸ͳ͍ • ݩʑͷ yield a ͱஔ͖׵͑ޙͷ yield* toIterable(a) ͸ಉ͡ಈ͖Λͯ͠΄͍͠

Slide 41

Slide 41 text

Iterable ΁ͷม׵ type Comp = Generator, T, any>; function* waitFor(promise: Promise): Comp> { return yield promise; } • ୯Ұͷ஋Λ yield ͠ɺͦͷ஋Λ return ͢Δ͚ͩͷδΣωϨʔλΛ࡞Δ • yield* waitFor(a) ͸ yield a ͱಉ͡ಈ࡞Λ͢Δ͕ɺܕ৘ใ͕૿͍͑ͯΔ

Slide 42

Slide 42 text

Iterable ʹม׵͢Δ declare function run(comp: Comp): Promise>; function* myFunc(): Comp { const x = yield* waitFor(doX()); // x: X const y = yield* waitFor(doY(x)); // y: Y return y; } const promise = run(myFunc()); // promise: Promise • run() ʹରͯ͠͸֎͔ΒܕΛ͚ͭΔ͚ͩͰ׬੒

Slide 43

Slide 43 text

͜͜·Ͱͷ·ͱΊ • ࣗ࡞ async / await ʹܕΛ෇͚Δʹ͸ 2 ͭͷน͕͋Δ • δΣωϨʔλ͕Ͳ͏ݺ͹ΕΔ͔อূ͕ͳ͍ • yield ࣜ͝ͱʹҟͳΔܕ͕෇͚ΒΕͳ͍ • લऀ͸ن໿ԽͰΧόʔՄೳɺޙऀ͸ yield ࣜͷ୅ΘΓʹ yield* ࣜΛ࢖͏͜ͱͰ ৐Γӽ͑ΒΕΔ

Slide 44

Slide 44 text

ᶅ Ԡ༻ͦͷ 1: Result ܕ

Slide 45

Slide 45 text

Promise Ҏ֎΁ͷԠ༻ • ͜͜·ͰͷςΫχοΫ͸ Promise Λ࢖ͬͨॲཧҎ֎ʹ΋Ԡ༻͕Մೳ • δΣωϨʔλ͔Β yield ͞Εͨ஋ͱɺδΣωϨʔλͷ࢒ΓͷܭࢉΛɺ
 ্खʹ͚ͬͭ͘Δ͜ͱ͕Ͱ͖ͨΒΑ͍ (= Ϟφυ) • Promise ͷ৔߹͸ then() ͕͜ͷ໾ׂΛ͍࣋ͬͯΔ

Slide 46

Slide 46 text

Promise Ҏ֎΁ͷԠ༻ • ྫ͑͹ Result ܕ΋͜Εʹ౰ͯ͸·Δ • then() ʹରԠ͢Δͷ͸ԼͷΑ͏ͳ৚݅෼ذ type Result = Ok | Err; if (!res.isOk) return res; return cont(res.value);

Slide 47

Slide 47 text

Result ܕ΁ͷԠ༻ • Promise Ͱ͸ then() ͕ await (yield*) ʹஔ͖׵͑ΒΕͨ // before doX().then((x) => doY(x).then((y) => doZ(y).then((z) => // ... ) ) ); // after const x = await doX(); const y = await doY(x); const z = await doZ(y); // ...

Slide 48

Slide 48 text

Result ܕ΁ͷԠ༻ • Result Ͱ΋ಉ͡Α͏ʹஔ͖׵͑ΒΕΔ → ΤϥʔϋϯυϦϯάΛ؆ུԽ // before const x = doX(); if (!x.isOk) return x; const y = doY(x.value); if (!y.isOk) return y; const z = doZ(y.value); if (!z.isOk) return z; // ... // after const x = yield* doX(); const y = yield* doY(x); const z = yield* doZ(y); // ...

Slide 49

Slide 49 text

Result ܕ΁ͷԠ༻ • ࣮૷͸ׂѪ (ઌ΄Ͳͱಉ͡ susisu/tskaigi2025 ʹ׬શ൛͕͋Γ·͢) • run() ͷఆٛ͸ Promise ͷ࣌ͱ΄΅ಉ͡ (then() ͕ҟͳΔ͚ͩ) type Comp = Generator, T, any>; declare function run(comp: Comp): Result; function* myFunc(): Comp { /* ... */ } const result = run(myFunc()); // result: Result

Slide 50

Slide 50 text

Result ܕࣗମΛ Iterable ʹ͢Δ • Promise ͱ͸ҟͳΓɺResult ܕࣗମΛ Iterable ʹ΋Ͱ͖Δ • yield* ࣜΛ࢖͏ͱ͖ͷม׵ΛखͰॻ͘ඞཁ͕ͳ͘ͳͬͯศར class Ok { // ... *[Symbol.iterator](): Comp { return yield this; } }

Slide 51

Slide 51 text

͜͜·Ͱͷ·ͱΊ • δΣωϨʔλΛ࢖ͬͨςΫχοΫ͸ Promise Ҏ֎ʹ΋Ԡ༻͕Մೳ • yield ͞Εͨ஋ͱ࢒ΓͷܭࢉΛ্ख͚ͬͭ͘͘ΒΕͨΒྑ͍ (Ϟφυ) • ྫͱͯ͠ Result ܕͷ৔߹Λ঺հ • ଞʹ΋͍Ζ͍Ζ • neverthrow, E ff ect ͳͲͷϥΠϒϥϦ • ύʔαίϯϏωʔλ • etc.

Slide 52

Slide 52 text

ᶆ Ԡ༻ͦͷ 2: ΤϑΣΫτ

Slide 53

Slide 53 text

ΤϑΣΫτ • ;ͭ͏ϓϩάϥϜ͸࣮ߦ͢Δͱ༷ʑͳΤϑΣΫτΛൃੜͤ͞Δ • ը໘ʹจࣈ΍ը૾Λදࣔ͢ΔɺϑΝΠϧΛಡΈॻ͖͢Δɺ
 ωοτϫʔΫϦΫΤετΛߦ͏ɺݱࡏ࣌ࠁΛऔಘ͢ΔɺͳͲͳͲ • ͜ΕΒͷΤϑΣΫτΛ্खʹऔΓѻ͍͍ͨ → ΤϑΣΫτγεςϜ • ϓϩάϥϜͷͲͷ෦෼͕ωοτϫʔΫϦΫΤετΛߦ͏ͷ͔஌Γ͍ͨ • ςετͰ͸ωοτϫʔΫϦΫΤετΛϞοΫͰ୅༻͍ͨ͠

Slide 54

Slide 54 text

• ͜Μͳ;͏ʹϓϩάϥϜ͕ॻ͚Δͱͨ͠Βʁ ΤϑΣΫτγεςϜ // 発生し得るエフェクトの種類を型でトラッキング function* main(): Eff { const icon = yield* httpGet("https://susisu.ch/icon.svg"); yield* writeFile("./icon.svg", icon); }

Slide 55

Slide 55 text

• ͜Μͳ;͏ʹϓϩάϥϜ͕ॻ͚Δͱͨ͠Βʁ ΤϑΣΫτγεςϜ // 型に現れないエフェクトを発生させたらコンパイルエラー function* main(): Eff { const icon = yield* httpGet("https://susisu.ch/icon.svg"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ yield* writeFile("./icon.svg", icon); }

Slide 56

Slide 56 text

ΤϑΣΫτγεςϜ • ͜Μͳ;͏ʹϓϩάϥϜ͕ॻ͚Δͱͨ͠Βʁ // 通常は実際に読み書き runAsync( interpret(main(), { net: interpretNet, fs: interpretFs, }), ); // テストではモック実装 runPure( interpret(main(), { net: mockNet, fs: mockFs, }), );

Slide 57

Slide 57 text

ΤϑΣΫτγεςϜ • ͜Μͳ;͏ʹϓϩάϥϜ͕ॻ͚Δͱͨ͠Βʁ • → ॻ͚·ͨ͠ (࣮ݧతͳϥΠϒϥϦΛ࡞Γ·ͨ͠) • https://github.com/susisu/e ff ectful • ͜͜·Ͱʹ঺հͨ͠ͷ͸શ࣮ͯࡍʹಈ࡞͢Δίʔυ • ཧ࿦తʹ͸ Algebraic E ff ects & Handlers ͱݺ͹ΕΔύϥμΠϜ

Slide 58

Slide 58 text

ΤϑΣΫτγεςϜͷ࣮૷ • δΣωϨʔλͷܕఆٛ͸ Promise ΍ Result ͷ৔߹ͱجຊ͸ಉ͡ • ͨͩ͠۩ମతͳσʔλ (Ϟφυ) ͷ෦෼͸ΤϑΣΫτͱͯ͠ந৅Խ͓͍ͯͯ͠ɺ
 ޙ͔Β࣮ߦ͢ΔՕॴ (ϋϯυϥ) Ͱܾఆ͢Δ // before type Comp = Generator, T, any>; type Comp = Generator, T, any>; // after type Eff = Generator, T, any>;

Slide 59

Slide 59 text

࣌ؒͶ͐ʔ • ໘ന͍͜ͱ͕ͨ͘͞Μ͋Δ͚Ͳ࿩͕࣌ؒ͢଍Γͳ͍ʂ • ࣮૷ʹ࢖ͬͨςΫχοΫ • ϢχΦϯܕͰΤϑΣΫτͷ row Λૉ௚ʹදݱ (ׂͱ TypeScript ಛ༗) • interface ͷએݴϚʔδΛ࢖ͬͨߴ֊ܕ (ΤϑΣΫτͷந৅Խʹඞཁ) • GADT (ந৅Խͨ͠ΤϑΣΫτͷ໭Γ஋ͷܕΛݻఆ) • ΤϑΣΫτγεςϜΛ࢖ͬͯ۩ମతʹԿΛ͢Δͷ͔ʁ (࢖͑Δͷ͔ʁ) • Ask the Speaker ΍࠙਌ձͰ࿩͠·͠ΐ͏ :pray:

Slide 60

Slide 60 text

·ͱΊ

Slide 61

Slide 61 text

·ͱΊ (1/2) • δΣωϨʔλؔ਺͸தஅɾ࠶։Ͱ͖Δܭࢉͱͯ͠ݟΔ͜ͱ͕Ͱ͖Δ • ͜ΕΛ࢖͑͹ async / await ૬౰ͷه๏Λࣗ࡞Ͱ͖Δ • TypeScript Ͱ͸ͪΐͬͱ͓ͨ͠·͡ͳ͍Ͱ֓Ͷ্ख͘ܕΛ෇͚ΒΕΔ • yield Λ yield* ʹஔ͖׵͑Δ / ͦͷͨΊʹ Iterable ʹม׵͢Δ

Slide 62

Slide 62 text

·ͱΊ (2/2) • δΣωϨʔλΛ࢖ͬͨςΫχοΫ͸ Promise Ҏ֎ʹ΋Ԡ༻͕Մೳ • yield ͞Εͨ஋ͱ࢒ΓͷܭࢉΛ্ख͚ͬͭ͘͘ΒΕͨΒྑ͍ (Ϟφυ) • ۩ମతʹ͸ Result ܕͳͲ • ͞Βʹ͸ Algebraic E ff ects ͷΑ͏ͳ΋ͷ΋࣮ݱͰ͖Δ • TypeScript ໘ന͍