0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JSDoc vs TypeScript について考えてみた

Posted at

はじめに

フロントエンド開発において、型安全性は開発体験の向上とバグの削減に欠かせない存在になっています。しかし、「どうやって型安全を手に入れるか?」という点が、開発者の間でずっと議論の的になっています。

TypeScriptは強力な型システムと豊富なエコシステムで多くの開発者に愛用されている一方で、ビルドステップが複雑になったり、コンパイル時間が長くなったりという課題も抱えています。そんな中、JavaScriptのコメント内に型情報を書くJSDocが再び注目を集めています。

記事では、「ビルド不要」という点が非常に魅力的なJSDocと、豊富な型定義が可能なTypeScript、この2つの現状を整理しながら、「結局どちらがいいの?」という点について考えていきます。

JSDocとTypeScriptの基本的な違い

基本的なアプローチの違い

JSDocは「JavaScriptはJavaScriptのまま」という思想で、コメント内に型情報を書きます。一方、TypeScriptは言語レベルで型構文を提供しています。

// JSDocスタイル:コメントで型を定義
/**
 * ユーザー情報を取得する関数
 * @param {string} userId - ユーザーID
 * @param {boolean} includeProfile - プロフィール情報を含むか
 * @returns {Promise<{id: string, name: string}>}
 */
async function getUserInfo(userId, includeProfile) {
    // ビルド不要で直接実行可能
}
// TypeScriptスタイル:言語レベルで型を定義
interface UserInfo {
    id: string;
    name: string;
}

async function getUserInfo(
    userId: string, 
    includeProfile: boolean
): Promise<UserInfo> {
    // コンパイルが必要
}

最大の違いはビルドするか、しないか

JSDoc: ビルド不要で直接実行可能
TypeScript: コンパイルステップが必要

この違いは、小規模プロジェクトや個人開発で特に大きな影響を与えます。

比較してみる

TypeScriptは高度な型定義が簡潔に書ける一方、JSDocでは記述が繁雑になりがちです。

主な違い

項目 JSDoc (+ @ts-check) TypeScript
ビルド 不要 必須
導入 ファイル先頭に // @ts-check 環境セットアップが必要
型定義の表現力 基本的な型は十分、複雑な型は煩雑 非常に高い
コードとの統合 コメントなので分離 コードと一体化
エコシステム TypeScriptの .d.ts を活用可能 圧倒的
学習コスト JSDocの記法を覚える必要 TypeScriptの記法を覚える必要

エディタサポートの現状

VS CodeのTypeScript Language Serverのおかげで、JSDocでもTypeScriptとほぼ同等の開発体験が得られます。

// @ts-check - TypeScriptの型チェックを有効化

/**
 * ユーザーオブジェクトを作成する
 * @param {string} name - ユーザー名
 * @param {number} age - 年齢
 * @returns {{name: string, age: number, createdAt: Date}}
 */
function createUser(name, age) {
    return {
        name,
        age,
        createdAt: new Date() // 自動補完やエラー検出が動作
    };
}

// 型エラーも適切に表示される
createUser("Alice", "30"); // エラー: numberではなくstringが渡されている

主な機能

  • IntelliSense: 型情報の表示
  • エラー検出: リアルタイム型チェック
  • 自動補完: プロパティやメソッドの補完
  • リファクタリング: 変数名の一括変更

実践事例:SvelteKit

SvelteKitはJSDocを公式にサポートし、「シンプルなビルドステップ」の哲学と一致しています。

// src/routes/+page.server.js - サーバーサイドロジック
// @ts-check

/**
 * ページデータをロードする関数
 * @type {import('./$types').PageServerLoad}
 */
export async function load({ params, url }) {
    const userId = url.searchParams.get('userId'); // URLパラメータからユーザーIDを取得
    
    if (!userId) {
        throw error(400, 'User ID is required'); // バリデーションエラー
    }
    
    const user = await getUserFromDatabase(userId); // データベースからユーザー情報を取得
    
    return { user }; // コンポーネントにデータを渡す
};

プロジェクトでの使い分け

  • ライブラリコード: TypeScriptで型安全性を重視
  • アプリケーションコード: JSDocでシンプルさを重視

このアプローチで、理想的なバランスが実現できます。

2024-2025年の最新動向

Types as Commentsプロポーザル

JavaScript標準仕様に型構文を追加する提案が進んでいます。実現した場合、ビルド不要でTypeScript風の型構文が使用可能になります。

ビルドツールの進化

Vite、SWC、Bunなどの高速ビルドツールの登場で、TypeScriptのコンパイル時間は大幅に短縮されています。

ランタイムの進化

DenoやBunはTypeScriptファイルを直接実行できるため、「ビルド不要」というJSDocのメリットは相対的に小さくなってきています。

Node.js v23.6.0からのTypeScript直接実行

さらに注目すべき動きとして、Node.js v23.6.0以降ではTypeScriptファイルを直接実行できる機能が追加されました。
この機能は**Type Stripping(型情報の削除)**によって実現されており、以下のような特徴があります:

  • 型チェックは行わない: トランスパイル(型情報の削除)のみ実行
  • 実行時変換: ビルド済みファイルを作成せず、メモリ上でリアルタイム変換
  • シンプルな型のみ対応: 複雑な型変換やモジュール解決には制限がある
// app.ts - 型チェックなしで直接実行される
interface User {
    name: string;
    age: number;
}

function createUser(name: string, age: number): User {
    return { name, age };
}

console.log(createUser("Alice", 30));

ただし、この機能にはいくつかの制限があります:

  • 実験的機能: 本番環境での利用は推奨されない
  • 型安全性なし: 型エラーが検出されずランタイムエラーの可能性
  • 型チェックは別途必要: tsc --noEmit での型チェックが推奨される

つまり、「実行はできるけど、型安全性は保証しない」という状況で、JSDocの「ビルド不要」のメリットとは異なる性質を持っています。

現在の棲み分け

TypeScriptに適しているケース:

  • 大規模・長期プロジェクト
  • チーム開発
  • 複雑な型定義が必要

JSDocに適しているケース:

  • 小規模プロジェクトや個人開発
  • 既存JavaScriptプロジェクトの段階的移行
  • シンプルなスクリプト

結論は「適材適所」

JSDocとTypeScriptは、もはや「どちらが正しいか」ではなく、状況に応じて選択するものだと思いました。

選択のガイドライン

JSDocが適している場面:

  • 小規模なNode.jsスクリプト
  • 既存JavaScriptプロジェクトへの段階的導入
  • ビルドプロセスを避けたい場面
  • SvelteKitなどJSDocを推奨するフレームワーク

TypeScriptが適している場面:

  • 大規模・長期プロジェクト
  • チーム開発
  • 複雑な型定義が必要
  • 豊富なエコシステムを活用したい場合

今後の展望

ビルドツールの高速化、Types as Commentsの進展、新しいランタイムの普及により、JSDocとTypeScriptの境界線は更に曖昧になると予想されます。

まとめ

「ビルド不要」は魅力的ですが、それだけで技術を選択すべきではありません。プロジェクトの規模、チームの構成、保守性の要求、そして開発者の価値観を総合的に判断することが重要です。

昨今では、JSDocでもTypeScriptでも優れた開発体験が得られます。この選択肢の豊富さこそ、JavaScriptエコシステムの魅力です。


参考URL

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?