- TypeScript
tsconfig設定一覧|TypeScript 7対応の推奨値とテンプレート
tsconfig.jsonとは、TypeScriptコンパイラ(tsc)に「どのファイルを、どのJavaScriptの版で、どれくらい厳しく型チェックするか」を伝える設定ファイルです。 2026年7月に公開されたTypeScript 7.0(Go言語で書き直されたネイティブ版)では、strict が既定で有効になり、baseUrl や "target": "es5" などは設定するとエラーで止まるようになりました。
この記事では、主要オプションを「意味・推奨値・理由」の一覧表で整理し、TypeScript 7.0で変わった既定値と削除されたオプションを実際に出たエラー文つきでまとめます。さらに、Vite+React、Node.js ESM、ライブラリ、Next.jsのコピペ用テンプレートと、同じプロジェクトを tsc 5.9/6.0/7.0で型チェックした実行時間も載せています。検証はすべて TypeScript 7.0.2(npm の latest)、比較用に 6.0.3・5.9.3、Node.js 22.22.2 で行いました。
tsconfig 主要オプションの早見表
| オプション | 意味 | 推奨値(2026年) | TS 7.0の既定値 |
|---|---|---|---|
target |
出力するJSの版 | es2022〜es2024(実行環境に合わせる) |
es2025 |
module |
出力するモジュール形式 | ビルドツールあり→esnext/Node.js→nodenext |
esnext |
moduleResolution |
importの探し方 | bundler または nodenext |
module から自動(多くは bundler) |
lib |
使える組み込みAPIの型 | target と揃える+ブラウザなら DOM |
target から自動 |
strict |
厳格な型チェック一式 | true |
true |
noUncheckedIndexedAccess |
配列・辞書の要素に undefined を足す |
true |
false |
exactOptionalPropertyTypes |
?: に undefined 代入を禁止 |
true(新規なら) |
false |
verbatimModuleSyntax |
型だけのimportに type を必須に |
true |
false |
isolatedModules |
1ファイル単位の変換で安全な書き方に限定 | true |
false |
paths |
importの別名(@/ など) |
必要なら。./ 始まりで書く |
なし |
rootDir |
ソースの起点 | ./src を明示 |
tsconfigのあるフォルダ |
outDir |
出力先 | ./dist |
なし |
declaration |
.d.ts を出力 |
ライブラリは true |
false |
sourceMap |
.js.map を出力 |
Node.jsアプリは true |
false |
skipLibCheck |
.d.ts の検査を省略 |
true |
false |
jsx |
JSXの変換方法 | React 17以降は react-jsx |
なし |
types |
自動で読む @types |
使うものを列挙(["node"] など) |
[](空) |
allowJs |
.js もコンパイル対象に |
移行中だけ true |
false |
incremental |
差分ビルド情報を保存 | 大きめのプロジェクトで true |
false |
noEmit |
JSを出力しない | ビルドツールに任せるなら true |
false |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「tsconfig設定一覧|TypeScript 7対応の推奨値とテンプレート」
TypeScript 7.0で変わった既定値の一覧
TypeScript 7.0は、6.0で予告された既定値の変更と非推奨オプションの削除をそのまま引き継いでいます。 公式ブログ「Announcing TypeScript 7.0」と「TypeScript 6.0」のリリースノートで確認した内容です。
| オプション | 5.x までの既定値 | 6.0/7.0の既定値 | 影響 |
|---|---|---|---|
strict |
false |
true |
何も書かないと厳格チェックになる |
module |
commonjs(target依存) |
esnext |
出力がESMになる |
target |
es5 |
その時点の最新の確定版(7.0.2は es2025) |
構文が変換されずに出力される |
types |
node_modules/@types を全部読む |
[] |
process や fs が見つからなくなる |
rootDir |
入力ファイルから推測 | tsconfigのあるフォルダ | outDir の中の構成が変わることがある |
noUncheckedSideEffectImports |
false |
true |
import "./x" の書き間違いを検出 |
libReplacement |
true |
false |
速度のための変更 |
stableTypeOrdering |
なし | 7.0では常に有効 | 型の並び順が決定的になる |
esModuleInterop |
false |
常に true(false 不可) |
— |
何も設定しない tsconfig でも、7.0では strict のエラーが出ます。 次のファイルを { "include": ["src"] } だけの tsconfig で型チェックしました。
// src/app.ts
import "./polyfils"; // ファイル名のつづり間違い
function total(prices) {
return prices.reduce((a, b) => a + b, 0);
}
let memo: string = null;
console.log(total([100, 200]), memo);
$ npx tsc -p . --noEmit # TypeScript 7.0.2
src/app.ts(1,8): error TS2882: Cannot find module or type declarations for side-effect import of './polyfils'.
src/app.ts(2,16): error TS7006: Parameter 'prices' implicitly has an 'any' type.
src/app.ts(3,25): error TS7006: Parameter 'a' implicitly has an 'any' type.
src/app.ts(3,28): error TS7006: Parameter 'b' implicitly has an 'any' type.
src/app.ts(5,5): error TS2322: Type 'null' is not assignable to type 'string'.
同じファイルを TypeScript 5.9.3 で実行するとエラー0件(終了コード0)でした。 つまり「tsconfigを変えていないのに7.0で急にエラーが増えた」ときは、既定値の変更が理由です。すぐに全部直せない場合は "strict": false を書けば従来に近い動きになります(7.0.2で strict: false はエラーになりません)。
TypeScript 7.0で削除されエラーになるオプション
6.0では「非推奨」の警告(ignoreDeprecations: "6.0" で抑止可)だったものが、7.0では「削除済み」となり、抑止できません。
| 設定 | 7.0での扱い | 代わりの書き方 |
|---|---|---|
"target": "es5" |
削除(TS5108) | es2015 以上 |
"target": "es3" |
値として受け付けない(TS6046) | es2015 以上 |
"downlevelIteration" |
削除(TS5102) | 削除するだけ |
"moduleResolution": "node" / "node10" |
削除(TS5108) | bundler か nodenext |
"moduleResolution": "classic" |
削除(TS5108) | bundler か nodenext |
"module": "amd" / "umd" / "system" / "none" |
削除(TS5108) | esnext+バンドラー |
"baseUrl" |
削除(TS5102) | paths を ./ 始まりで書く |
"outFile" |
削除(TS5102) | esbuild・Rollupなどのバンドラー |
"esModuleInterop": false |
削除(TS5108) | 書かない(常に true) |
"allowSyntheticDefaultImports": false |
削除(TS5108) | 書かない |
"alwaysStrict": false |
削除(TS5108) | 書かない |
"ignoreDeprecations": "6.0" |
7.0では効かない | 上の置き換えを行う |
5.x時代に廃止済みの importsNotUsedAsValues などは TS5023: Unknown compiler option になります。コード側では module Foo {}(→ namespace Foo {})と import ... asserts {}(→ with {})も使えなくなりました(公式ブログより)。
古いtsconfigを6.0と7.0で実行したエラー
2020年ごろの解説によくある設定を、6.0.3と7.0.2で実行しました。
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"baseUrl": ".",
"paths": { "@/*": ["src/*"] },
"downlevelIteration": true,
"esModuleInterop": false,
"outDir": "dist"
},
"include": ["src"]
}
$ npx tsc -p . # TypeScript 6.0.3(抜粋)
tsconfig.json(3,15): error TS5107: Option 'target=ES5' is deprecated and will stop functioning in TypeScript 7.0. Specify compilerOption '"ignoreDeprecations": "6.0"' to silence this error.
tsconfig.json(6,5): error TS5101: Option 'baseUrl' is deprecated and will stop functioning in TypeScript 7.0. ...
(moduleResolution・downlevelIteration・esModuleInterop も同様に計5件+rootDir の TS5011)
$ npx tsc -p . # TypeScript 7.0.2
tsconfig.json(3,15): error TS5108: Option 'target=ES5' has been removed. Please remove it from your configuration.
tsconfig.json(5,25): error TS5108: Option 'moduleResolution=node10' has been removed. Please remove it from your configuration.
tsconfig.json(6,5): error TS5102: Option 'baseUrl' has been removed. Please remove it from your configuration.
Use '"paths": {"*": ["./*"]}' instead.
tsconfig.json(7,24): error TS5090: Non-relative paths are not allowed. Did you forget a leading './'?
tsconfig.json(8,5): error TS5102: Option 'downlevelIteration' has been removed. Please remove it from your configuration.
tsconfig.json(9,24): error TS5108: Option 'esModuleInterop=false' has been removed. Please remove it from your configuration.
tsconfig.json(10,5): error TS5011: The common source directory of 'tsconfig.json' is './src'. The 'rootDir' setting must be explicitly set to this or another path to adjust your output's file layout.
7.0では baseUrl がなくなるため、paths の "src/*" も「./ がない」というエラー(TS5090)になります。 直した設定は次のとおりです。
{
"compilerOptions": {
"target": "es2022",
"module": "nodenext",
"rootDir": "./src",
"outDir": "./dist",
"types": ["node"],
"paths": { "@/*": ["./src/*"] }
},
"include": ["src"]
}
types を書き忘れると、import { readFileSync } from "fs" で次のエラーになりました。7.0の既定値は types: [] なので、Node.jsの型は明示が必要です。
src/index.ts(2,30): error TS2591: Cannot find name 'fs'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig.
paths は「型チェック用」、実行時は imports を使う
paths はtscが型を解決するための設定で、出力されるJSのimport文は書き換えません。 上の設定でビルドは通りますが、node dist/index.js を実行すると次のエラーになりました。
Error: Cannot find module '@/utils/format'
ビルドツールを使わないNode.jsアプリでは、package.json の imports(サブパスインポート)を使うと、tscとNode.jsの両方が同じ別名を理解します。
{
"type": "module",
"imports": { "#app/*": "./dist/*" }
}
// src/index.ts
import { yen } from "#app/utils/format.js";
$ npx tsc -p . && node dist/index.js
120円
340円
TypeScript 6.0以降は #/ で始まる別名にも対応していますが、Node.js 22.22.2では #/utils/format.js が ERR_INVALID_MODULE_SPECIFIER になりました。 Node.js 22で使うなら #app/ のように # の後に名前を付けると動きます。
TypeScript 7.0へ上げる手順
公式は「6.0で ignoreDeprecations なしにエラーなくビルドできれば、7.0でも動く」としています。 そのため、5.xからは6.0を経由すると原因を切り分けやすくなります。
| 手順 | コマンド/作業 |
|---|---|
| 1. 6.0で確認 | npm i -D typescript@6 → npx tsc --noEmit |
| 2. 非推奨を解消 | 上の「削除されるオプション」表のとおり置き換え |
| 3. 既定値の変更に備える | types・rootDir・(必要なら)strict を明示 |
| 4. 7.0へ | npm i -D typescript@7.0.2(コマンド名は tsc のまま) |
| 5. 旧版も残す場合 | npm i -D typescript6@npm:@typescript/typescript6(コマンドは tsc6) |
7.0は安定したプログラム用APIをまだ公開していません。 公式ブログによると、Vue・Svelte・Astro・MDX・Angularテンプレートなど、埋め込み言語の型チェックは当面6.0を使う想定です(7.1でAPI提供予定)。なお今回、create-vite 9.2.1 のReact+TypeScriptテンプレート(生成時は typescript ~6.0.2)を7.0.2に差し替えて npm run build(tsc -b && vite build)を実行したところ、変更なしでビルドが通りました。
tsc 5.9/6.0/7.0の実行時間を実測
同じプロジェクトを型チェックすると、このマシンでは7.0.2が6.0.3の約4.4倍速でした。 各5回実行した中央値です。
| 条件 | 5.9.3 | 6.0.3 | 7.0.2 |
|---|---|---|---|
tsc --noEmit |
8.33秒 | 8.70秒 | 1.96秒 |
tsc --noEmit --singleThreaded |
— | — | 2.71秒 |
tsc(JS出力あり) |
— | 12.66秒 | 4.45秒 |
使用メモリ(--extendedDiagnostics) |
— | 464,127K | 310,853K |
- 環境:Linux、2 vCPU、Node.js 22.22.2(他の処理と同居しているため誤差があります)
- 対象:自動生成した1,500ファイル・約36,000行(interface・ジェネリクス・クラス・再帰の型を含む)
- 公式ブログでは実プロジェクトで7.7〜11.9倍。並列処理で速くなる設計で、型チェックの並列数は
--checkers(既定4)で変えられます。
主要オプションを目的別に理解する
target と lib:出力するJSの版
target は「どの構文まで変換せずに出力するか」、lib は「どの組み込みAPIの型を使えるか」です。 lib を省略すると target に合わせて自動で決まり、ブラウザ向けに DOM を足すときだけ明示します。TS 6.0以降、dom.iterable は dom に統合されたので "lib": ["ES2023", "DOM"] で足ります。
| 実行環境 | target の目安 |
|---|---|
| 最新ブラウザ+Vite | es2022〜es2023(Viteテンプレートは es2023) |
| Node.js 20 | es2023 |
| Node.js 22以降 | es2024 |
| 変換はバンドラーに任せる | esnext でも可 |
module と moduleResolution:import の扱い
7.0で選べる moduleResolution は bundler・nodenext・node16 の3つです(tsc --help --all で確認)。module を nodenext にすると moduleResolution も自動で nodenext になります。
| 使い方 | module | moduleResolution | 相対importの拡張子 |
|---|---|---|---|
| Vite・Next.jsなどのバンドラー | esnext / preserve |
bundler |
省略できる |
| Node.jsでそのまま実行 | nodenext |
(自動で nodenext) |
.js が必要 |
nodenext で拡張子を省くと、次のエラーになります。
src/bad.ts(1,21): error TS2835: Relative import paths need explicit file extensions in ECMAScript imports when '--moduleResolution' is 'node16' or 'nodenext'. Did you mean './order.js'?
ソースが .ts でも、import には出力後の .js を書くのがNode.js ESMのルールです。
厳しさを上げる3つのオプション
strict に含まれない追加チェックは、新規プロジェクトなら最初から有効にすると後から直す量が減ります。 次のコードを3つを有効にしてチェックしました。
import { Task } from "./task"; // Task は interface
const tasks: Task[] = [{ id: 1, title: "備品の発注" }];
const first = tasks[0];
console.log(first.title);
const stock: Record<string, number> = { pen: 3 };
const n: number = stock["pen"];
const t: Task = { id: 2, title: "在庫確認", note: undefined }; // note?: string
src/main.ts(1,10): error TS1484: 'Task' is a type and must be imported using a type-only import when 'verbatimModuleSyntax' is enabled.
src/main.ts(5,13): error TS18048: 'first' is possibly 'undefined'.
src/main.ts(8,7): error TS2322: Type 'number | undefined' is not assignable to type 'number'.
src/main.ts(10,7): error TS2375: Type '{ id: number; title: string; note: undefined; }' is not assignable to type 'Task' with 'exactOptionalPropertyTypes: true'. ...
| オプション | 見つけてくれること | 直し方 |
|---|---|---|
noUncheckedIndexedAccess |
範囲外アクセス・存在しないキー | if (first) や ?? 0 で確認 |
exactOptionalPropertyTypes |
「無い」と「undefined」の混同 |
プロパティ自体を書かない |
verbatimModuleSyntax |
型のimportが実行時に残る問題 | import type { Task } |
用途別テンプレート(コピペ用)
どのテンプレートもTypeScript 7.0.2で tsc を実行して確認しています(Next.jsのみ生成ファイルの転記、下記参照)。
Vite + React
create-vite 9.2.1(--template react-ts)が生成する tsconfig.app.json です。ルートの tsconfig.json は references で tsconfig.app.json と tsconfig.node.json を束ねます。
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "es2023",
"lib": ["ES2023", "DOM"],
"module": "esnext",
"types": ["vite/client"],
"allowArbitraryExtensions": true,
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"verbatimModuleSyntax": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
"noUnusedLocals": true,
"noUnusedParameters": true,
"erasableSyntaxOnly": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"]
}
strict は書かれていませんが、6.0以降は既定で有効です。noUncheckedIndexedAccess: true を足すと、配列アクセスの見落としも検出できます。
Node.js(ESM、tscでビルドして実行)
package.json に "type": "module" を書いた上で使います。
{
"compilerOptions": {
"target": "es2024",
"lib": ["es2024"],
"module": "nodenext",
"types": ["node"],
"rootDir": "./src",
"outDir": "./dist",
"sourceMap": true,
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
"verbatimModuleSyntax": true,
"isolatedModules": true,
"skipLibCheck": true
},
"include": ["src"]
}
$ npx tsc -p . && node dist/index.js
合計数量: 7 function
ライブラリ(npm公開用、型定義つき)
{
"compilerOptions": {
"target": "es2022",
"lib": ["es2022"],
"module": "nodenext",
"types": [],
"rootDir": "./src",
"outDir": "./dist",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
"verbatimModuleSyntax": true,
"skipLibCheck": true
},
"include": ["src"]
}
package.json は "exports": { ".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" } } とします。ビルドすると dist/ に index.js・index.js.map・index.d.ts・index.d.ts.map が出力されました。利用者の環境が幅広いライブラリは target を少し低め(es2022)にしておくと安心です。
Next.js
create-next-app 16.3.7 のAppルーターテンプレートに含まれる tsconfig.json です(転記のみ。テンプレートが入れるTypeScriptは ^5)。
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "react-jsx",
"incremental": true,
"plugins": [{ "name": "next" }],
"paths": { "@/*": ["./*"] }
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts", "**/*.mts"],
"exclude": ["node_modules"]
}
paths が ./ 始まりで baseUrl を使っていないため、TypeScript 7.0の削除項目には当たりません。 plugins はエディタ用の言語サービスプラグインで、公式ブログによれば7.0は安定APIを未公開のため、エディタ補助は6.0系で動かす形になります。Next.jsプロジェクトを7.0で動かす検証はこの記事では行っていません。
よくある質問
Q. tsconfig.jsonを一から作るには?
A. npx tsc --init を実行します。 7.0.2では module: "nodenext"・target: "esnext"・types: []・strict・noUncheckedIndexedAccess・exactOptionalPropertyTypes・verbatimModuleSyntax などが有効な状態で生成されました。Node.jsで使う場合はコメントのとおり types: ["node"] に変えます。
Q. baseUrl を消すと @/ の別名はどうなりますか?
A. paths を "@/*": ["./src/*"] のように ./ 始まりで書けば、baseUrl なしで動きます。 実行時の解決はバンドラー(Vite・Next.js)か、Node.jsなら package.json の imports に任せます。
Q. 7.0でエラーが大量に出て、すぐには直せません。
A. まず "strict": false と "types": ["*"] を明示すると、5.x に近い挙動に戻せます(types: ["*"] は6.0リリースノートにある旧挙動の指定方法)。削除されたオプションは戻せないので、6.0(@typescript/typescript6)を併用しながら段階的に置き換えます。
Q. 設定が実際にどう解釈されているか確認するには?
A. npx tsc --showConfig で、extendsを展開した最終的な設定を表示できます。 読み込まれたファイルは --listFiles、所要時間は --extendedDiagnostics で確認できます。
まとめ
- TypeScript 7.0では
strict・module: esnext・types: []が既定。何も書かなくても厳格チェックになる baseUrl・target: es5・moduleResolution: node10/classic・outFileなどは設定するとエラー。ignoreDeprecationsも効かないpathsは./始まりで書き、実行時の別名はバンドラーかpackage.jsonのimportsに任せる- Node.jsは
nodenext+.js拡張子、バンドラーはbundlerと使い分ける noUncheckedIndexedAccess・exactOptionalPropertyTypes・verbatimModuleSyntaxを足すと見落としを早く見つけられる- 実測では7.0.2の型チェックは6.0.3の約4.4倍速(2 vCPU、1,500ファイル)
- 移行は6.0でエラー0にしてから7.0へ上げると切り分けやすい
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「tsconfig設定一覧|TypeScript 7対応の推奨値とテンプレート」
株式会社RJCでは、新しいバージョンが出るたびに設定を実際に動かして確かめ、その結果をプロジェクトの中で仲間と共有しています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。