Error [has been removed. Please remove it from your configuration]

error TS5102: Option '...' has been removed の直し方(TypeScript が削除した compiler option と、ignoreDeprecations が効かなくなる境界)

FIX SUMMARY verified
Applies when
node:22.23.1-alpineTypeScript 5.6+ (importsNotUsedAsValues / target ES3 removed in 5.6; ignoreDeprecations no longer applies)tsc with a removed compilerOption (e.g. importsNotUsedAsValues, target ES3) after upgrading TypeScript to 5.6 or later (removal boundary; deprecated with an ignoreDeprecations escape through 5.5)

Verified: reproduced in node:22.23.1-alpine, then the has been removed. Please remove it from your configuration signature was gone after the fix (exit 0).

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 で削除されたことです。importsNotUsedAsValuestarget: "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 で入りましたimportsNotUsedAsValuestarget: 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 を直します。代表的な対応は次のとおりです。

削除されたオプション書き換え先
importsNotUsedAsValuesverbatimModuleSyntax: true
preserveValueImportsverbatimModuleSyntax: true
target: "ES3"target: "ES5" 以上(多くは ES2015 以上)

importsNotUsedAsValuespreserveValueImports は、どちらも 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 が出るcharsetkeyofStringsOnlynoImplicitUseStrictout(→ 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=ES3TS5108)で終了コード 2
  • 修正:importsNotUsedAsValuesverbatimModuleSyntax: true に、targetES2015 に書き換えると、同じ 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 のリリースノートに沿っています。

検証(machine-verified)

この修正は node:22.23.1-alpine のバージョン固定コンテナ内で再現し、修正後に has been removed. Please remove it from your configuration のシグネチャが消えることを機械で確認しています。

verify — run-case.mjs
$ node run-case.mjs node/typescript-removed-compiler-option
● reproduce has been removed. Please remove it from your configuration present ✓
● apply fix exit 0
● re-run has been removed. Please remove it from your configuration gone ✓
PASS verified · node:22.23.1-alpine · signature gone

確認したのは上のイメージの中だけです。別の環境で直らなかった、記述が違う、という場合は 報告してください(対象と検証イメージは件名・本文に入ります)。