Slide 1

Slide 1 text

tsc.ripを支える技術 id:susisu / 2026-08-22 Kyoto.なんか #8

Slide 2

Slide 2 text

こんにちは • id:susisu です • 株式会社はてな Webアプリケーションエンジニア/ シニアエンジニア • 文字はデカければデカいほど 良い

Slide 3

Slide 3 text

tsc.rip • 2026 年 7 月 8 日に TypeScript 7.0 がリリース • コンパイラ (tsc) の実装が TypeScript から Go に移植され高速化 • tsc.rip はこれを記念して作った Web サイト

Slide 4

Slide 4 text

tsc.rip を支える技術 • AWS 静的サイト 激安 • CloudFront • Lambda (Function URL) • Go 製 Web サーバー + Lambda Web Adapter

Slide 5

Slide 5 text

tsc.rip を支える技術 • AWS 静的サイト 激安 • CloudFront S3 で良いのでは? • Lambda (Function URL) • Go 製 Web サーバー + Lambda Web Adapter

Slide 6

Slide 6 text

$ curl https://tsc.rip ポ ブラウザと curl でレス ンスが異なる

Slide 7

Slide 7 text

tsc.rip を支える技術 • AWS 静的サイト 激安 • CloudFront CloudFront Functions で 向き先の S3 オブジェクトを 変えたら良いのでは? • Lambda (Function URL) • Go 製 Web サーバー + Lambda Web Adapter

Slide 8

Slide 8 text

$ curl https://tsc.rip/echo \ -XPOST -dHello ディを処理するエンド ポ ボ リクエスト イントもある

Slide 9

Slide 9 text

tsc.rip を支える技術 • AWS 静的サイト 激安 • CloudFront 静的??? • Lambda (Function URL) • Go 製 Web サーバー + Lambda Web Adapter

Slide 10

Slide 10 text

嘘は一つもない。どういうこと? • AWS 静的サイト 激安 • CloudFront • Lambda (Function URL) • Go 製 Web サーバー + Lambda Web Adapter

Slide 11

Slide 11 text

$ curl https://tsc.rip -i X-Type-Instantiations ヘッダ???

Slide 12

Slide 12 text

嘘は一つもない。どういうこと? • 答え: 型レベル Web アプリケーションだったから。 リクエストのハンドリングは、すなわち「静的検査」だったのだ。

Slide 13

Slide 13 text

tsc.rip を支える技術 • AWS 静的サイト 激安 • CloudFront • Lambda (Function URL) 主犯格とみられる人物 • Go 製 Web サーバー + Lambda Web Adapter

Slide 14

Slide 14 text

tsc.rip を支える技術 (裏) • Go 製 Web サーバー • typescript-go を組み込み • リクエストを型に変換 → 型を評価 → 型をレス • TypeScript の型で書かれたアプリケーション ポ • export type Handle = Res; ンスに変換

Slide 15

Slide 15 text

型を評価する方法 • tsc のコンパイルエラーを見る • Language Server を使う • Compiler API を使う

Slide 16

Slide 16 text

tsc のコンパイルエラー • 意図的に型エラーを発生させ、メッセージに含まれる型情報を抽出する • 長い型はデフォルトで省略されるが、--noErrorTruncation オプションで 回避できる • リクエストごとにプロセスを起動するので遅い • RIP 感はある

Slide 17

Slide 17 text

Language Server • サブプロセスとして Language Server を起動して通信する • 長い型はデフォルトで省略されるが、オプションで回避できる (らしい) • 今回は次の Compiler API を使ったので詳細未検討

Slide 18

Slide 18 text

Compiler API • サーバーにコンパイラ自体をライブラリとして組み込む • TypeScript 実装では API が公開されている • Go 実装では (少なくとも現時点では) 非公開 (internal 以下) だが、 ハックすると無理やり使うことはできる

Slide 19

Slide 19 text

Compiler API // server/typeeval/go.mod // github.com/microsoft/typescript-go を自称すると internal 以下も使える module github.com/microsoft/typescript-go/_tscrip/typeeval // ... require github.com/microsoft/typescript-go v0.0.0-20260708042240-2bd066d87f5b // typescript/v7.0.2 // server/go.mod module github.com/susisu/tsc.rip/server // ... // github.com/microsoft/typescript-go/_tscrip/typeeval は公開なので使える replace github.com/microsoft/typescript-go/_tscrip/typeeval => ./typeeval

Slide 20

Slide 20 text

Compiler API • Compiler API が使えるようになったが、使い方がわからない • Fable「マカセテ」 • 調査任せてたらなんかプロトタイプできたとか言ってきたので採用

Slide 21

Slide 21 text

型レベル Web アプリ • アプリ本体はリクエストを引数に取ってレス ンスを返す型エイリアス • export type Handle = Res; • ルーティングやヘッダ、 ディの解釈などは基本的に全てアプリ側で実装 • Content-Length の計算など一部 Go 側に任せているものもある ートしていないので実用には向かない ポ ポ ボ • ストリームや副作用はサ

Slide 22

Slide 22 text

型レベル Web アプリ export type Routes = { "/": { GET: (( Req["headers"] extends { accept: infer Accept extends string } ? accept.Negotiate : "text/plain" ) extends "text/html" ? res.HTML<200, `(略)`> : res.Text<200, "The tsc is dead, long live the tsc!\n">) & hs.Link<`; rel="author"`> & hs.CacheControl<"public, max-age=3600"> & hs.Vary<"accept">; }; // ... };

Slide 23

Slide 23 text

型レベル Web アプリ export type Handle = Routes extends { [_ in Req["path"]]: infer Handlers } ? Handlers extends { [_ in Req["method"]]: infer Res } ? Res : Req["method"] extends "HEAD" ? Handlers extends { GET: infer Res } ? Res : res.Error<405, "Method Not Allowed\n"> & hs.Allow> : res.Error<405, "Method Not Allowed\n"> & hs.Allow> : res.Error<404, "Not Found\n">; type AllowedMethods = utils.Join< utils.UnionToTuple<"GET" extends keyof Handlers ? "HEAD" | keyof Handlers : keyof Handlers>, ", " >;

Slide 24

Slide 24 text

まとめ • tsc.rip の裏では型レベル Web アプリケーションが動いていた • TypeScript 万歳 • 型レベルで Web アプリケーションを書くのはおすすめしません

Slide 25

Slide 25 text

おまけ • https://github.com/susisu/tsserver に公開版のサーバー実装があります