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
型安全RESTで爆速プロトタイピング – Hono RPC実践
Search
tacke
May 27, 2025
Programming
610
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
型安全RESTで爆速プロトタイピング – Hono RPC実践
https://layerx.connpass.com/event/355401/
でのLTスライド
tacke
May 27, 2025
More Decks by tacke
See All by tacke
スモールチームがAmazon Cognitoでコスパよく作るサービス間連携認証
tacke_jp
4
5.6k
Androidエンジニアが抑えておくべきUnicode Emojiの知識 (DroidKaigi 2019) / Unicode Emoji for Android Engineer DroidKaigi09
tacke_jp
12
4.9k
Parse.comからGCPへ移行した話 ~1年間にわたる脱出プロジェクト~
tacke_jp
2
2.2k
Other Decks in Programming
See All in Programming
Swiftのレキシカルスコープ管理
kntkymt
0
220
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
240
Vite+ Unified Toolchain for the Web
naokihaba
0
240
さぁV100、メモリをお食べ・・・
nilpe
0
140
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
320
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
520
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.3k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
150
ふつうのFeature Flag実践入門
irof
7
3.7k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
500
Modding RubyKaigi for Myself
yui_knk
0
910
スマートグラスで並列バイブコーディング
hyshu
0
120
Featured
See All Featured
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
470
Side Projects
sachag
455
43k
4 Signs Your Business is Dying
shpigford
187
22k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
280
How to Ace a Technical Interview
jacobian
281
24k
Context Engineering - Making Every Token Count
addyosmani
9
960
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
200
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.4k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Transcript
商号等 三井物産デジタル‧アセットマネジメント株式会社 ⾦融商品取引業者 関東財務局⻑(⾦商)第3277号 加⼊協会 ⽇本証券業協会、⼀般社団法⼈ ⽇本投資顧問業協会、⼀般社団法⼈ 第⼆種⾦融商品取引業協会 ©Mitsui & Co.
Digital Asset Management, Ltd. 型安全RESTで爆速プロトタイピング ‒ Hono RPC実践 TS Kaigi 2025 After Night LT 2025.5.27
Who am I? • AI Product Team Manager in MDM
(LayerXから出向) • 社内向け内製 LLM Webアプリ を full TypeScript で開発 • モットー: “Build → Ship → Feedback” を最速ループ • 今⽇のテーマ: そのループを⽀える Hono RPC 2 武市 融紀 (X: @tacke_jp)
The “API-Typing” Problem • フロント ↔ サーバー間は ただの JSON •
🛑 型がない → 仕様 drift / runtime error • 既存解 ◦ gRPC ▶ readable じゃない ◦ tRPC ▶ JSON が独特 ◦ GraphQL / JSON-RPC ▶ 汎⽤だけど over-spec • 欲しいのは: ⼈間が読める REST + TypeScript 型安全 3
Landscape Quick Scan 4 ⽅式 プロトコル∕ペイロード 読みやすさ コード⽣成 gRPC HTTP/2,
ProtoBuf 😵 必要 GraphQL POST 1本 😐 (スキーマ必要) tRPC JSON-RPC 😐 不要 Hono RPC 純REST 😀 不要
Enter Hono RPC • Hono: 超軽量Webアプリケーションフレームワーク (24k stars) • RPC
機能 ◦ export type AppType = typeof app → hc<AppType>() だけ ◦ コード⽣成ゼロで型を共有 5 RESTful JSON に 型 をのせる コード⽣成 0, Hot-reload 100%を実現
How it Works // server.ts const route = app .post(
'/posts', zValidator('json', z.object({ title: z.string(), body: z.string(), })), (c) => c.json({ ok: true, message: 'Created!', }, 201) ) export type AppType = typeof route 6 // client.ts import { hc } from 'hono/client' import type { AppType } from '../server' const client = hc< AppType>('/api') const res = await client.posts.$post({ json: { title: 'Hello', body: 'Hono RPC is cool', }, }) // data: { ok: boolean; message: string } const data = await res.json()
✨ What I Like • 普通の REST + 強い型 =
学習コストほぼゼロ • 変更 → 即 red-squiggle (tRPC 同等体験) • ルート毎に HTTP ステータス × 型 を区別可 • 型安全だから UI <-> API 断絶を防⽌ 7
⚠ Caveats / Gotchas in Practice • full-TS プロジェクト限定 •
ミドルウェア経由の Response型は 現状推論されない • 複雑な型は IDE 上で … 折り畳まれる ◦ Tips: 末端 hover ∕ c.json<Foo>() のように明⽰型を付ける • ルータは method chain で書かないと推論が途切れる ◦ 公式ドキュメントでも⾮RPC部分の例はchainしていないので Coding Agentが引っ張られがち 8
⚠ Caveats / Gotchas in Practice (2) // ❌ NG:
各ハンドラを後から繋げる const app = new Hono() app.get('/hello', (c) => c.json({ msg: 'hi' })) app.post('/hello', (c) => c.json({ ok: true })) export type AppType = typeof app // ←推論されない! 9 // ✅ OK: chain してから変数に束ねる const route = new Hono() .get('/hello', (c) => c.json({ msg: 'hi' })) .post('/hello', (c) => c.json({ ok: true })) export type AppType = typeof route // works
Case Study: “Copilot” for ファンド契約書 • pnpm workspaceで web (Next.js)
と backend (Hono API server) を分離 ◦ api で export type AppType → web で hc<AppType>() • SWR + Hono Client = 型安全 Data Fetching • API で { success: true | false } union を返す ◦ UI 側で toast 必須チェック を静的解析 • cookieAuth middleware は new Hono<{ Variables: AuthUser }>() で推 論注⼊ 10
まとめ • REST 可読性 × 型安全 × 開発速度 = Hono
RPC • プロトタイピング勢‧Edge Deploy 勢に特におすすめ • 試したくなったら 👉 pnpm add hono @hono/zod-validator 11
コーポレートサイト https://corp.mitsui-x.com/ サービスサイト(ALTERNA) https://alterna-z.com/