- 2023年、SvelteリポジトリのリファクタリングPRがJSDocベースのコードへ移行し、TypeScript懐疑派の注目を集めた
- Svelte側はこれを反TypeScriptの立場ではなく、TypeScriptへの継続的な依存の一環だと説明
- この記事はJSDocとTypeScriptを対立構造で捉えず、JSDoc自体がTypeScriptの一部であることを強調
- TypeScriptはIntelliSenseエンジンとして、JSDocコメントの解釈とコード補完機能の両方を担う
- JSDocはビルド段階なしで同等の静的解析能力を提供し、現代のJSプロジェクトで実質的にTypeScriptと同じ役割を果たす
Svelte PRと論争の背景
- 2023年5月、Svelteリポジトリの内部リファクタリングPRがHacker Newsのトップページに掲載された
- このPRは
.tsファイルの型宣言を.jsファイルのJSDocコメントへ移す変更だった
- 一部ではこれをTypeScriptの利点を拒否する行為だと解釈した
- Svelteの創設者Rich HarrisはHNで直接「これは反TypeScriptではない」と説明
- SvelteのTypeScriptへのコミットメントは依然として強いとも述べた
- この出来事以降、「TypeScript vs JSDoc」を比較する記事が多数登場し、JSDocを「ビルド段階のないTypeScript」と評価する流れが広がった
TypeScriptの起源と本質
- 2000年代後半〜2010年代初頭、JavaScriptは自動補完・型安全性が不足した言語と見なされていた
- Microsoftの開発者たちはScriptSharpを使い、C#コードをJSに変換する方式で対応していた
- このような背景からTypeScriptが誕生し、本質的にはJS開発を改善するためのビルドツールとして出発した
TypeScriptはIntelliSense
- TypeScriptは単なる言語ではなく、IntelliSenseエンジンとして機能する
.tsファイルを使わなくても、コード補完・引数情報・シンボル探索などの機能はTypeScript言語サービスが提供する
- ほとんどのエディタでは、JSコードを書いているときでもTypeScriptサービスがバックエンドとして動作している
TypeScriptはJSDoc
- TypeScript言語サービスはJSDocコメントの解釈にも使われている
- TypeScriptのCHANGELOGにはJSDoc関連機能の追加履歴が頻繁に含まれる
- JSDocベースのプロジェクトも
tsconfig.jsonで設定でき、tscコマンドで型チェックを実行可能
- したがってJSDocを使う開発者も、すでにTypeScriptを使っていることになる
JSDocベースのプロジェクト経験
- 筆者は既存プロジェクトのフロントエンドをJSDoc型コメントベースで書き直した経験を共有している
- **列挙型(enum)**のようなランタイム機能を除けば、ほとんどのTypeScript表現はJSDocで可能
- ジェネリクスは文法がやや複雑だが、型推論をより積極的に活用するようになる
- JSDocプロジェクトでは関数をクリックしたときに実際のコードへ移動でき、開発体験が向上した
- TypeScriptツールのエコシステムはJSDocプロジェクトでも再利用可能
- 例: OpenAPIやGraphQLスキーマから型を生成するライブラリは、JSDocコメント形式で型を生成できる
結論と追加事例
- JSDocはTypeScriptの代替ではなく、同じ静的解析体系を共有している
- ビルド段階を省略しながらも、同等の型安全性を提供する
- さらに、webpackプロジェクトもJSDocへ移行した事例が言及されている
- TypeScriptの専門家として、筆者は「JSDocはTypeScriptだ」という立場を明確に示している
1件のコメント
Hacker Newsの意見
長年 Python/JavaScript でWebやロボティクスのソフトウェアを開発・保守してきて学んだことをまとめたもの 型は明示しなくても存在しており、明示しなければ結局は頭の中にだけ存在することになる しかし人間の記憶は揮発性が高く、他人からアクセスしにくい だから 型付けは優れたドキュメント手段 である JSDocとTypeScriptは型を表現する標準的な形式で、どちらにも長所と短所がある 重要なのは、一貫性と予測可能性を持って型を定義することだ 型チェッカーは「では証明してみて」と言うコンピュータなりのやり方だ すべてのプログラムが同じレベルの証明を必要とするわけではなく、過剰な証明は無駄になりうる だから私は、必要な分だけ「証明できる」言語を好む
私は ビルドステップなし でJavaScriptで作れるものは何でも好きだ 現代的なHTML/CSSとWeb Components、そしてJSDocの組み合わせは過小評価されている 誰にでも合うわけではないが、十分に現代的なフロントエンドスタックの候補だと思う
SPAが流行していた時代、JSDocは型管理の救世主 だった その後Google Closure Compilerが登場してJSDocベースの型安全性を提供し、TypeScriptは独自構文とともに(TS)JSDocをサポートした コミュニティは最終的にTypeScriptを選び、Closure Compilerは消えていった そのため(TS)JSDocは MSがGoogleと競っていた時代の遺物 として残った 今ではTSはジェネリクス、Enum、ユーティリティ型、Vitestの型テスト、型ガードなど、はるかに多くの機能を提供している 私はTSとJSDocを併用している — TSはコード用、JSDocはドキュメント用(@link, @see, @deprecated, @example など)
JSDocでは表現できない型が多いと言われるが、Flow のように言語全体としてのアプローチが可能だったらよかったのではと思う TypeScriptでもそうできたはずなのに、なぜしなかったのか分からない
@templateで ジェネリックスロット を定義できる 例:JSDocで書かれたパッケージは CMD/CTRLクリックで実際のコードへ移動 できるので、開発体験が良い
5年前のミートアップで、ある発表者が「TypeScriptが嫌ならJSDocが代替になる」と言っていた 私はそれは結局 どちらもTypeScript だと説明したが、上司は信じなかった
反論として、JSDocはTypeScriptではない
@typedefで定義した型は自動的にexportされ、それを制御する方法がない 関連イシュー このためライブラリ開発時に IntelliSenseが雑然と露出 して不便だった「JSDocはTypeScriptの代替ではない」という主張には同意する JSDocも 静的解析を提供するがビルドステップがない Node公式ドキュメント 参照
swcのようなツールでの型削除速度も十分速いTypeScriptが他の選択肢を押しのけて勝利した理由は、新しい言語ではなく型チェッカーであり続けたから だ 初期には方向性がややぶれたが、適切に修正され、今ではほとんどのコードでenumすらあまり使われていない
VSCodeでは「TypeScript: Prefer Go To Source Definition」設定を有効にすると、実際のソースへ移動できる また
tsconfigにdeclarationMap: trueを追加すると、より正確に動作する 私はほとんど常に cmd+clickでソースを見る ほうを好む