Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Susisu
July 24, 2026
Programming
260
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
TSKaigi Mashup Kansai #2 TSKaigi 2026を振り返ろう!
の発表資料です
Susisu
July 24, 2026
More Decks by Susisu
See All by Susisu
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
120
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
2.3k
Go で言うところのアレは TypeScript で言うとコレ / Kyoto.なんか #7
susisu
7
2.8k
君だけのオリジナル async / await を作ろう / TSKaigi 2025
susisu
20
16k
null or undefined
susisu
25
7.9k
Mackerel のフロントエンドフレームワーク移行 序章 / Hatena Engineer Seminar #13
susisu
0
2.3k
スクリーンショット撮影のために Puppeteer を操る / Kyoto.js 16
susisu
0
1k
BuckleScript 使ってみた
susisu
0
430
Atom パッケージ開発のすゝめ
susisu
1
2.3k
Other Decks in Programming
See All in Programming
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
360
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
7.6k
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
130
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
370
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
580
Oxlintはいいぞ(続)
yug1224
1
400
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
200
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
510
Go 1.27 における memory allocation の高速化
andpad
0
300
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
280
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
460
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
220
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
480
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
680
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.5k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
940
Designing Experiences People Love
moore
143
24k
Docker and Python
trallard
47
4.1k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
280
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Scaling GitHub
holman
464
140k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Transcript
これって Effectで できたの では? 2026-07-24 TSKaigi Mashup Kansai #2 susisu
こんにちは • /^(id:|@)susisu(2413)?$/ です • 株式会社はてな Webアプリケーションエンジニア / シニアエンジニア •
文字はデカければデカいほど 良いとされる
None
Stage 2.7 Decorators
印象に残った発表
None
None
賛否両論
我々はどうすべきか • (特にサーバーサイド TypeScript について) • Hono, Next.js などが全てをカバーしてくれるわけではない •
NestJS というかデコレータは先行き怪しい ff ff • E ect やっていき / E ect やめていき
わからない
調べてみよう
None
E ect • https://e ect.website • E ect-TS とも ff
ff ff • TypeScript の汎用ライブラリ/フレームワーク
解決したい課題 • 例外処理をいい感じにやりたい • DI をいい感じにやりたい • 並行処理をいい感じにやりたい • ...
https://susisu.hatenablog.com/entry/2022/11/04/211406
https://susisu.hatenablog.com/entry/2023/06/18/181507
https://speakerdeck.com/susisu/kyoto-dot-nanka-number-7
これって Effectで できたの では?
例外処理 • E ect では Effect<A, E> を使ってプログラムを表現する • c.f.
Promise<A>, Result<A, E> import { Effect } from "effect" ff const divide = ( a: number, b: number ): Effect.Effect<number, "DIVIDE_BY_ZERO"> => b === 0 ? Effect.fail("DIVIDE_BY_ZERO") : Effect.succeed(a / b)
例外処理 import { Console, Effect } from "effect" // main:
Effect.Effect<void, "DIVIDE_BY_ZERO"> const main = Effect.gen(function* () { const answer = yield* divide(42, 7) yield* Console.log(answer) }) Effect.runFork(main) // => 6
例外処理 import { Console, Effect, Either } from "effect" //
main: Effect.Effect<void, never> const main = Effect.gen(function*() { const answer = yield* divide(42, 7).pipe(Effect.either) if (Either.isLeft(answer)) return yield* Console.log(answer.right) }); Effect.runFork(main) // => 6
DI • E ect では Effect<A, E, R> を使ってプログラムを表現する ff
• R はプログラムの実行に必要な依存関係 (requirements)
DI import { Console, Context, Effect } from "effect" class
Random extends Context.Tag("MyRandomService")< Random, { readonly next: Effect.Effect<number> } >() {} // program: Effect.Effect<void, never, Random> const program = Effect.gen(function* () { const random = yield* Random const randomNumber = yield* random.next yield* Console.log(`random number: ${randomNumber}`) }) Effect.runFork(program) // ← 型エラー
DI // ... const runnable = Effect.provideService(program, Random, { next:
Effect.sync(() => Math.random()) }) Effect.runFork(runnable) // => 0.6792671590288922
並行処理 • Effect<A, E, R> は Fiber 上で実行される • 軽量スレッド,
Go でいうところの goroutine import { Effect, Fiber } from "effect" const main = Effect.gen(function* () { const fiber = yield* Effect.fork(child) // ... yield* Fiber.join(fiber) })
並行処理 • Fiber は中断可能 • Go では context.WithCancel を使ってやるようなやつ import
{ Effect, Fiber } from "effect" const main = Effect.gen(function* () { const fiber = yield* Effect.fork(child) yield* Effect.sleep("10 seconds") const exit = yield* Fiber.interrupt(fiber) });
並行処理 • 並行処理で使える Queue なども揃ってる • Go でいう channel など
import { Console, Effect, Fiber, Queue } from "effect" const main = Effect.gen(function* () { const queue = yield* Queue.bounded<number>(1) const fiber = yield* Effect.fork(Queue.take(queue).pipe(Effect.andThen(Console.log))) yield* Queue.offer(queue, 42) yield* Fiber.join(fiber) })
他にも色々 • リトライ • キャッシュ • リクエストのバッチ化 • c.f. p-retry,
lru-cache, dataloader
デメリット • pipe / ジェネレータを使った記法はややゴツく見えるかも • 外の世界のライブラリを使う場合は I/F を整える必要がある •
先述の通りあらかじめ用意されているものも多い • めちゃめちゃ機能が多い • ライブラリを探すのと同じように必要な機能だけ見れば良くはある
まとめ • E ect は汎用ライブラリ/フレームワーク • 例外処理, DI, 並行処理, その他諸々を扱うための道具が揃っている
ff • 採用するかは「場合による」けど、調べてみて選択の幅は広がった
余談 • fp-ts との関係と違い • Scala の ZIO との関係 •
Effect<A, E, R> を「エフェクト」と呼んでいいのか