
TypeScript 7移行ガイド:レガシー設定を整理してモダンな開発環境を構築する実践アプローチ
お疲れ様です!IT業界で働くアライグマです!
先日、私がPjMとして関わっているプロジェクトで、TypeScriptのバージョンアップ作業を行いました。tsconfig.jsonを開いてみると、target: “es5"やbaseUrlなど、数年前に設定したまま放置されていたレガシー設定が山積みになっていました。
「このまま放置しても動くけど、TypeScript 7で非推奨になる設定があるらしい」「どこから手をつければいいかわからない」という声がチーム内から上がり、私が調査と移行計画を担当することになりました。
本記事では、TypeScript 7で廃止・非推奨になる設定を整理し、レガシーなtsconfig.jsonをモダンな構成に移行するための具体的な手順を、私のプロジェクトでの実践経験をもとに解説していきます。
TypeScript 7で変わるtsconfig設定の全体像
まずは、TypeScript 7で廃止・非推奨になる設定の全体像を整理しておきます。
TypeScript 7では、長年「互換性のために残されていた」レガシー設定が正式に廃止される予定です。具体的には、以下のような設定が影響を受けます。
- target: “es5":ES5へのトランスパイルはBabelやesbuildに任せる方向に
- baseUrl:パスエイリアスの解決方法が変更される
- outDir相対パス:出力ディレクトリの指定方法が厳格化
- moduleResolution: “node":Node.js 16以降の解決方式に統一
- esModuleInterop:デフォルトでtrueになり、明示的な指定が不要に
これらの変更は、TypeScriptの設計思想が「トランスパイラ」から「型チェッカー」へとシフトしていることを反映しています。
TypeScriptの設計思想については、TypeScript型安全実践ガイド:Zodとzod-to-tsで実現する実行時バリデーションとスキーマ駆動開発も参考になります。
TypeScriptの型システムを深く理解するには、ある設計思想の書籍ソフトウェアアーキテクチャの基礎が参考になります。

レガシー設定の影響度を可視化する
ここでは、私のプロジェクトで実際に調査した、レガシー設定の使用率と移行の優先度を可視化します。
下のグラフは、私がPjMとして関わった5つのプロジェクトで、各レガシー設定がどの程度使われていたかを示したものです。
ケーススタディ:レガシー設定の棚卸し
私のチームでは、以下の手順でレガシー設定の棚卸しを行いました。
状況(Before):
プロジェクトは3年前に開始され、TypeScript 4.5で構築されていました。チームはフロントエンドエンジニア4名、バックエンドエンジニア2名の構成で、ビルド時間は平均約45秒、型チェックのエラー数は月平均約12件発生していました。tsconfig.jsonには以下の設定が残っていました。
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"baseUrl": "./src",
"outDir": "./dist",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}
行動(Action):
TypeScript 7の変更点を調査し、以下の修正を行いました。
- target: “es5" → target: “es2022" に変更(ES5へのダウンレベルはesbuildに委譲)
- baseUrl → paths設定に移行し、baseUrlは削除
- moduleResolution: “node" → moduleResolution: “node16" に変更
- esModuleInteropは明示的に残す(互換性のため)
結果(After):
ビルド時間が平均約45秒から約38秒に短縮(約15%改善)され、型チェックのエラーメッセージもより明確になりました。月平均の型エラー数は12件から3件に減少し、VSCodeの補完精度も向上しました。
TypeScriptのビルド最適化については、npm Shai-Hulud感染チェックと対策:サプライチェーン攻撃から開発環境を守る実践ガイドも参考になります。
TypeScriptプロジェクトの構成管理には、ある実践書リファクタリング(第2版)が参考になります。

target設定の移行:ES5からES2022へ
ここでは、最も影響の大きいtarget設定の移行手順を解説します。
なぜtarget: “es5″が非推奨になるのか
TypeScript 7では、「TypeScriptはトランスパイラではなく型チェッカーである」という設計思想がより明確になります。ES5へのダウンレベル変換は、esbuildやBabelなど専用ツールに任せる方向に進んでいます。
移行手順
私のチームでは、以下の手順でtarget設定の移行を進めました。まずは現状の設定を確認し、影響範囲を特定してから変更を行うことが重要です。
- 現在のtarget設定を確認する
- プロジェクトのサポート対象ブラウザ/Node.jsバージョンを確認する
- target設定を適切なバージョンに変更する
- ビルドツール(esbuild/Babel)でダウンレベル変換を設定する
{
"compilerOptions": {
"target": "es2022",
"module": "esnext",
"moduleResolution": "node16",
"strict": true,
"noEmit": true
}
}
noEmit: trueを設定することで、TypeScriptは型チェックのみを行い、実際のトランスパイルはesbuildなどに任せる構成になります。
esbuildとの連携については、Qwik実践ガイド:Resumabilityで実現する超高速Webアプリケーション開発も参考になります。
ビルドツールの選定には、ある思考法の書籍達人プログラマーが参考になります。

baseUrlとpaths設定の移行
ここでは、baseUrl設定の移行と、パスエイリアスの新しい設定方法を解説します。
baseUrlの問題点
baseUrl設定は、パスエイリアスの解決に使われてきましたが、私のプロジェクトでも以下のような問題が発生していました。特にモノレポ構成への移行時に、これらの問題が顕在化しました。
- 相対パスと絶対パスの解決が曖昧になる
- モノレポ構成で予期しない挙動を引き起こす
- ビルドツールとの整合性が取りにくい
paths設定への移行
TypeScript 7では、baseUrlを使わずにpaths設定のみでパスエイリアスを定義することが推奨されます。
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"],
"@components/*": ["./src/components/*"],
"@utils/*": ["./src/utils/*"]
}
}
}
この設定により、baseUrlを使わずにパスエイリアスを定義できます。
ビルドツールとの連携
paths設定を使う場合、ビルドツール側でも同様のエイリアス設定が必要です。esbuildの場合は以下のように設定します。
// esbuild.config.js
import { build } from 'esbuild';
await build({
entryPoints: ['src/index.ts'],
bundle: true,
outdir: 'dist',
alias: {
'@/*': './src/*',
'@components/*': './src/components/*',
'@utils/*': './src/utils/*'
}
});
モノレポ構成でのTypeScript設定については、Next.js 16 Cache Components完全ガイド:App Routerのキャッシュ戦略を根本から理解するも参考になります。
パスエイリアスの設計には、ある設計思想の書籍ソフトウェアアーキテクチャの基礎が参考になります。

まとめ
ここまで、TypeScript 7で廃止・非推奨になるレガシー設定と、モダンな構成への移行手順を整理してきました。
・TypeScript 7では、target: “es5″、baseUrl、moduleResolution: “node"などのレガシー設定が非推奨になる
・TypeScriptは「トランスパイラ」から「型チェッカー」へと設計思想がシフトしている
・target設定はes2022以上に変更し、ダウンレベル変換はesbuildやBabelに任せる
・baseUrlはpaths設定に移行し、ビルドツールとの整合性を確保する
・移行は段階的に進め、まずは影響の小さい設定から着手する
TypeScript 7のリリースはまだ先ですが、今のうちからレガシー設定を整理しておくことで、スムーズな移行が可能になります。まずは自分のプロジェクトのtsconfig.jsonを確認し、非推奨設定がないかチェックしてみてください。
移行作業は一度にすべてを変更するのではなく、影響の小さい設定から段階的に進めることで、リスクを抑えながらモダンな構成へと移行できます。チーム全体で共通認識を持ちながら、計画的に進めていきましょう。
私のチームでは、まずesModuleInteropの明示的な指定から始め、次にmoduleResolution、最後にtargetという順番で移行を進めました。この順番であれば、各ステップでの影響範囲が限定され、問題が発生しても切り分けがしやすくなります。また、移行完了後はチーム内でナレッジシェアを行い、同様の課題を持つ他のプロジェクトにも展開できるようにしておくと、組織全体の技術的負債解消にもつながります。







