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
Susisu
July 24, 2026
Programming
250
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
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
5分でわかる Curry–Howard 同型対応
susisu
0
1.3k
Other Decks in Programming
See All in Programming
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
110
Google Apps Script で Ruby を動かす
kawahara
0
280
バグを直したら useEffect が消えた
colorful12
3
660
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
210
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
1
270
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
110
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
160
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
980
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
530
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
6
2k
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
220
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
RailsConf 2023
tenderlove
30
1.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Tell your own story through comics
letsgokoyo
1
1k
Prompt Engineering for Job Search
mfonobong
0
410
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Mobile First: as difficult as doing things right
swwweet
225
10k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
270
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
480
How STYLIGHT went responsive
nonsquared
100
6.2k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
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> を「エフェクト」と呼んでいいのか