TSKaigi 2026にプロポーザルが採択されました
テックリード @ 株式会社カケハシ
医療SaaSの共通基盤を開発。TypeScriptと関数型プログラミングで堅牢なシステム設計を実践。
TSKaigi 2026
2026年のTSKaigiにプロポーザルが採択されました。
TSKaigi 2024では「複雑なビジネスルールに挑む:正確性と効率性を両立するfp-tsのチーム活用術」というタイトルで登壇しました。TSKaigi 2025では「型システムが拓くセキュアな世界: TypeScriptで築くOIDC対応の認証基盤」で応募しましたが落選しており、今回はよりTypeScriptにフォーカスした話題で再挑戦しました。
トークの紹介
タイトル
TypeScriptのclassはなぜこうなったのか — 歴史・落とし穴・そして使いどころを探る30分
概要
TypeScriptのclassに癖を感じたことはありますか。2012年にTypeScriptが誕生した頃、classはまだJavaScriptの規格であるECMAScriptには存在しませんでした。TypeScriptが独自のclass実装を先行して提供し、ES2015でclassが標準化された後、両者の仕様を統合する長い旅が始まりました。
本セッションでは、この歴史を紐解いた上で、開発者が日常的に遭遇する落とし穴を根本原因から体系的に整理します。
- 構造的部分型
JavaやC#ではclass名が異なれば別の型ですが、TypeScriptでは構造が同じなら異なる名前のclassでも同じ型として扱われます。例えば、UserIdとOrderIdが相互に代入できてしまう、といった問題が起きます。 - 動的thisバインディング
JavaやC#ではメソッド内のthisはそのインスタンスに固定されますが、JavaScriptでは呼び出し方によってthisが変わります。メソッドを変数に代入したりコールバックとして渡すとthisが失われます。 - 型消去
TypeScriptの型情報はJavaScriptへトランスパイルされると消去されるため、private修飾子は型検査時には有効であるものの、実行時には何の保護にもなりません。JavaやC#のprivateとは根本的に異なります。 instanceofの限界
構造的部分型と型消去が組み合わさることで、instanceofによる型の絞り込みが期待通りに機能しないケースがあります。
特に他言語ユーザーがこれらの落とし穴に陥いるとき、構造的部分型・動的thisバインディング・型消去という3つの仕組みが寄与しています。これらを理解することで、classを使うべき場面・避けるべき場面の判断軸が明確になります。
歴史パート
トーク前半では、TypeScriptとECMAScriptのclass仕様が歩んできた歴史を追います。TypeScriptが先行実装したprivate修飾子やパラメータプロパティ、後からES2022で標準化された#プライベートフィールドの関係、[[Define]] vs [[Set]]論争や、デコレーター標準化に至るまでの10年の旅など、こうした歴史的経緯を知ることで、現在のclassの複雑さがなぜ生まれたのかが見えてきます。
実践パート
トーク後半では、4つの落とし穴それぞれに対して実際のコード例を示しながら、どう対処するかを解説します。構造的部分型によって意図しない型の互換性が生まれるケース、メソッドを変数に代入した際にthisが失われるケース、private修飾子が実行時には何の保護も提供しないケースなど、それぞれの落とし穴が実務上でいつ発生し、それに対してどのように向き合うと良いか紹介していきます。最終的には、classを使うなという話ではなく、なぜ使うのかを理解した上で選択するための判断軸を提示します。
プロポーザルを提出した背景
KAKEHASHI Tech Blogへの寄稿
2025年8月にKAKEHASHI Tech Blogへ「他言語経験者が知っておきたいTypeScriptのクラスの注意点」という記事を寄稿しました。この記事では、構造的部分型・thisバインディング・private修飾子・型消去という4つの注意点と、それぞれの実践パターンを解説しています。
記事への反響を通じて、classの複雑さに悩んでいる開発者が多いことを改めて実感しました。ブログ記事では紙面の制約から扱いきれなかった歴史的経緯 ([[Define]] vs [[Set]]論争、デコレーター標準化の10年の旅など) も含めて、30分のセッションで体系的に伝えたいと考え、プロポーザルを提出しました。
当日に向けて
闇雲にclassを使うなと断言するようなメッセージではなく、なぜclassを選ぶのかを理解した上で意識的に選択できる状態を目指すトークにしたいと考えています。TypeScriptのclassに馴染みのある方も、classに違和感を感じている方も、ぜひ聴きに来てください。