mcpField
A
allowjs-mixing

allowjs-mixing

github.com/marius-townhouse開発643 回インストール38 週間前に更新
リポジトリ

allowjs-mixing について

既存の JavaScript プロジェクトを段階的に移行するチーム向けの TypeScript ガイドです。`allowJs` で `.js` と `.ts` を混在させ、モジュールを順次変換する方法を説明します。

主な機能

  1. 01JavaScript と TypeScript の混在を有効化
  2. 02モジュールを段階的に変換
  3. 03依存グラフの末端から着手
  4. 04JavaScript と TypeScript 間のインポート
  5. 05JSDoc による JavaScript の型付け

活用シーン

  1. 01大規模な JavaScript コードベースの移行
  2. 02全面書き換えを避けた TypeScript 採用
  3. 03移行中の機能開発の継続

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/marius-townhouse/effective-typescript-skills --skill allowjs-mixing

インストール後、Claude Code で/allowjs-mixingを入力して読み込まれたか確認します。

詳細

allowJs を使用して TypeScript と JavaScript を混在させる

概要

大規模な JavaScript コードベースを TypeScript に移行する際、すべてを一度に置き換える必要はありません。コンパイラーオプション allowJs を使うと、同じプロジェクト内で .ts ファイルと .js ファイルを混在させ、段階的に TypeScript を導入できます。これにより、コードベースを動作する状態に保ちながら、ファイルを 1 つずつ変換していく段階的な移行が可能になります。

このアプローチは、一気に書き換えることが現実的ではない大規模な移行に不可欠です。

このスキルを使う場面

  • JavaScript プロジェクトを TypeScript に移行するとき
  • JS コードベースに TypeScript を段階的に導入するとき
  • TypeScript と JavaScript が混在するチームで作業するとき
  • 既存の大規模プロジェクトを変換するとき
  • チームがまだ TypeScript を学んでいるとき

絶対に守るルール

段階的な移行を可能にするため、allowJs を使用します。依存関係グラフの末端にあるモジュールから始め、モジュール単位でファイルを変換していきます。

検出

移行時の課題に注意してください。

// Can't migrate because:
- 1000+ JavaScript files
- Team still learning TypeScript
- Can't stop feature development
- Risk of breaking changes

allowJs を有効にする

// tsconfig.json
{
  "compilerOptions": {
    "allowJs": true,        // Allow JavaScript files
    "checkJs": false,       // Don't type check JS (optional)
    "outDir": "./dist",
    "strict": true
  },
  "include": ["src/**/*"]
}

移行戦略

Phase 1: Enable allowJs
  - Add tsconfig.json with allowJs: true
  - Rename one file to .ts as proof of concept
  - Ensure build still works

Phase 2: Convert leaf modules
  - Start with files that have no dependencies
  - Utilities, helpers, constants
  - Low risk, easy wins

Phase 3: Work up dependency graph
  - Convert files that only depend on converted files
  - Gradually move toward entry points

Phase 4: Convert entry points last
  - Main files, app entry points
  - Most complex, most dependencies

ファイルを変換する

// utils.js (before)
export function formatDate(date) {
  return date.toISOString().split('T')[0];
}

export const PI = 3.14159;
// utils.ts (after)
export function formatDate(date: Date): string {
  return date.toISOString().split('T')[0];
}

export const PI = 3.14159;

JS と TS 間のインポート

// app.ts - TypeScript importing JavaScript
import { formatDate } from './utils.js';  // .js extension
// TypeScript trusts the JS (with checkJs: false)

// With types for JS module
declare module './utils.js' {
  export function formatDate(date: Date): string;
  export const PI: number;
}
// legacy.js - JavaScript importing TypeScript
import { User } from './types.ts';  // Works with allowJs
// JS doesn't get type checking, but can import TS

JavaScript に型を追加する

// @ts-check - Enable type checking for this file

/**
 * @param {string} name
 * @param {number} age
 * @returns {string}
 */
function greet(name, age) {
  return `Hello ${name}, you are ${age}`;
}

/** @type {string[]} */
const names = ['Alice', 'Bob'];

/** @typedef {{ x: number, y: number }} Point */

移行チェックリスト

// 1. Set up tsconfig.json with allowJs
{
  "compilerOptions": {
    "allowJs": true,
    "checkJs": false,  // Enable later for stricter checking
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true
  }
}

// 2. Start with simple files
// - No dependencies
// - Pure functions
// - Well-tested

// 3. Add types gradually
// - Start with any if needed
// - Refine over time

// 4. Enable strict mode checks incrementally
// - noImplicitAny
// - strictNullChecks
// - strictFunctionTypes

プレッシャーに負けないための手順

移行時には、次の点に従ってください。

  1. 最初に allowJs を有効にする:まずインフラを整えます
  2. 小さく始める:ファイルを 1 つ変換し、ビルドが動作することを確認します
  3. 末端のモジュールを優先する:依存関係が少ないほど簡単です
  4. 最初は any を使う:型は後から改善できます
  5. 進捗を記録する:小さな成果を祝いましょう

危険信号

アンチパターン問題解決策
一気に書き換えるリスクが高すぎ、時間がかかりますallowJs を使って段階的に進めます
エントリーポイントから変換する依存関係が多すぎます末端から始めます
tsconfig.json がないコンパイルを制御できません適切に設定します
途中で放棄する労力が無駄になります進捗を記録し、成果を祝いましょう

よくある正当化

「すべてを一度に変換する必要があります」

実際には:allowJs を使った段階的な移行は、大規模なコードベースにおいて、より安全で実用的です。

「JS と TS が混在すると分かりにくくなります」

実際には:これは一時的な状態であり、管理可能です。明確な移行計画があれば、整理された状態を保てます。

「このまま JS を使い続ければよいのです」

実際には:TypeScript のメリットは、時間とともに積み重なります。小さく始め、徐々に拡大しましょう。

クイックリファレンス

手順作業期間
1allowJs を指定して tsconfig を追加する1 日目
2ユーティリティファイルを 1~2 個変換する1 週目
3末端のモジュールを変換する2~4 週目
4依存関係グラフを上に向かって進める1~3 か月目
5エントリーポイントを変換する3~6 か月目
6allowJs を削除する(任意)完了時

要点

TypeScript を段階的に導入するには allowJs を使います。末端のモジュールから始め、ファイルを徐々に変換していきます。これにより、開発を止めることなく、大規模な移行を管理しやすくなります。

参考資料

  • Dan Vanderkam 著『Effective TypeScript』第 2 版
  • 項目 81:allowJs を使用して TypeScript と JavaScript を混在させる

コメント