TypeScript を上げてから、tsc がソースを型チェックする前に tsconfig.json のオプションで止まることがあります。
tsconfig.json(3,5): error TS5102: Option 'importsNotUsedAsValues' has been removed. Please remove it from your configuration.
Use 'verbatimModuleSyntax' instead.
tsconfig.json(4,15): error TS5108: Option 'target=ES3' has been removed. Please remove it from your configuration.
終了コードは 2 です。原因は、その compilerOptions が新しい TypeScript で削除されたことです。importsNotUsedAsValues や target: "ES3" のような古いオプションは、非推奨の期間を経て削除され、削除後は tsconfig.json に書いてあるだけで tsc が止まります。エラー文が has been removed(削除された)で、多くは移行先のオプションまで名指しします(Use 'verbatimModuleSyntax' instead.)。
直し方は、名指しされた移行先へ書き換えることです。削除されたオプションは残せません。
// tsconfig.json(変更前)
{
"compilerOptions": {
"importsNotUsedAsValues": "error", // 削除済み
"target": "ES3" // 削除済み
}
}
// tsconfig.json(変更後)
{
"compilerOptions": {
"verbatimModuleSyntax": true, // importsNotUsedAsValues の移行先
"target": "ES2015" // ES3 の代わりに有効な値へ
}
}
なぜ ignoreDeprecations では直らないのか
ignoreDeprecations は非推奨エラー(TS5101)を黙らせるための設定で、削除エラー(TS5102)には対応しません。古い TypeScript が案内する対処が、削除済みの版では効かない、ということです。
TypeScript 5.4 / 5.5 で同じ tsconfig.json を通すと、削除ではなく非推奨のエラーが出ます。
error TS5101: Option 'importsNotUsedAsValues' is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption '"ignoreDeprecations": "5.0"' to silence this error.
このとき、エラー文の指示どおり "ignoreDeprecations": "5.0" を足すと、5.4 / 5.5 系では黙り、tsc は通ります(実測で終了コード 0)。ここで「延命フラグを足して解決した」と記録が残ります。
ところが、さらに TypeScript を上げてオプションが削除された版に達すると、同じ ignoreDeprecations を付けても TS5102(削除)は消えません(実測で終了コード 2 のまま)。削除は TypeScript 5.6 で入りました(importsNotUsedAsValues と target: ES3 が 5.6.2 で TS5102 / TS5108 になり、ignoreDeprecations を付けても終了コード 2 のまま。以降 5.9 まで継続を確認)。延命策は、削除される版までの猶予でしかありません。本当の対処は、削除されたオプションを移行先へ書き換えることです。
なぜ新しい TypeScript で出るのか
境界は TypeScript のバージョンで、Node の版でもソースコードでもありません。削除前の版なら、同じ tsconfig.json は(非推奨の警告つきで)通ります。上げた後だけ削除エラーになります。
npm installで TypeScript が上がった:typescriptを緩く指定していると、クリーンインストールで新しい版が入ります。ローカルのnode_modulesに古い版が残っている環境では通り、CI やコンテナのクリーンインストールでだけ新しい版が入って落ちます。npm install -D typescript@latestや、周辺ツールに引かれて上げた:型定義やビルドツールの更新でピアの TypeScript が上がることがあります。
まず npx tsc --version で版を確認します。
なお、非推奨エラー(TS5101)の文面は「will stop functioning in TypeScript 5.5」のように版を名指ししますが、その版が実際の削除版とは限りません。実測では、5.5 系(5.5.4)でも ignoreDeprecations でまだ延命でき、**削除(TS5102)が入ったのは次の 5.6 系(5.6.2 で確認、5.9.3 まで継続)**でした。予告文の版を境界と決めつけず、使う版で実際に確かめます。
直し方:削除されたオプションを移行先へ書き換える
TS5102 / TS5108 のエラー文は、消したオプションと(多くの場合)移行先を示します。その通りに tsconfig.json を直します。代表的な対応は次のとおりです。
| 削除されたオプション | 書き換え先 |
|---|---|
importsNotUsedAsValues | verbatimModuleSyntax: true |
preserveValueImports | verbatimModuleSyntax: true |
target: "ES3" | target: "ES5" 以上(多くは ES2015 以上) |
importsNotUsedAsValues と preserveValueImports は、どちらも verbatimModuleSyntax に統合されました。ただし挙動は完全な同義ではなく、verbatimModuleSyntax は型だけの import を import type で明示することを求めます。書き換え後に「型なのに値として import している」といった指摘が出たら、その import を import type { ... } へ直します。これは削除エラーとは別の、意味づけの変更です。
target: "ES3" は、出力する JavaScript の言語水準です。ES3 は削除されたので、対象環境に合う値へ上げます。公式が案内する最も近い有効値は ES5 で、対象環境が新しければ ES2015 以上を選びます。実際の値は配布先のランタイムに合わせて決めます。
切り分け(うまくいかないとき)
ignoreDeprecationsを足したのにTS5102が消えない:そのオプションはもう非推奨ではなく削除されています。ignoreDeprecationsは削除には効きません。移行先へ書き換えます。verbatimModuleSyntaxにしたら、今度は import で型エラーが出る:verbatimModuleSyntaxは型だけの import をimport typeで書くことを求めます。指摘された import をimport type { ... }へ分けます。- 別のオプション名で
TS5102が出る:charset・keyofStringsOnly・noImplicitUseStrict・out(→outFile)など、他にも削除されたオプションがあります。エラー文が移行先を示すので、それに従います。示されない場合は TypeScript のリリースノートで該当版の削除を確認します。 - 同じツールチェーンで、ESLint 側が
.eslintrcを読まなくなった:こちらは ESLint 9 の設定形式の既定変更です(ESLint couldn’t find an eslint.config.js file の直し方)。lint とコンパイラで別々に起きます。 - 手元では通るのに CI でだけ落ちる:TypeScript の版が違います。CI のログで実際に入った
typescriptの版を確認します。
検証環境
node:22.23.1-alpine、ネットワーク有り、[email protected]- 再現:
importsNotUsedAsValues: "error"とtarget: "ES3"を持つtsconfig.jsonに対しnpx tscを実行すると、error TS5102: Option 'importsNotUsedAsValues' has been removed. Please remove it from your configuration.(とtarget=ES3のTS5108)で終了コード 2 - 修正:
importsNotUsedAsValuesをverbatimModuleSyntax: trueに、targetをES2015に書き換えると、同じapp.tsが終了コード 0・シグネチャ消滅
再現から修正までは errfix の検証ハーネスが機械的に確認しています。「非推奨→削除」の2段と ignoreDeprecations の効き目は、同じ tsconfig.json を複数の版で実行して確かめました:5.4.5 と 5.5.4 は非推奨エラー(TS5101 / TS5107)で "ignoreDeprecations": "5.0" を足すと終了コード 0 になり、5.6.2 で削除エラー(TS5102 / TS5108)に変わって ignoreDeprecations を足しても終了コード 2 のまま、5.9.3 でも同じでした(削除は 5.6 で入り、以降継続)。各版の終了コードはケースの verification/probes.txt に記録しています。移行先(verbatimModuleSyntax など)や切り分けに挙げた他の削除オプションは、エラー文の案内と TypeScript のリリースノートに沿っています。