TypeScript で「Cannot use JSX unless the '--jsx' flag is provided」が解決できない
JSX を含む .tsx を扱うには tsconfig の jsx オプションが要る。
未設定だと TS17004 が出るため、jsx を設定し拡張子を .tsx にすると解決する。
公開: 更新:
要約
このエラー(TS17004)は、JSX を含むコードを jsx コンパイラオプション無しでコンパイルしようとしたときに出る。tsconfig.json の compilerOptions.jsx に react-jsx などを設定し、ファイル拡張子を .tsx にすれば解決する。
実行例
TypeScript 5.9.3 で jsx を指定していない tsconfig のまま npx tsc を通すと TS17004 が出て終了コードは 2 になり、フラグを足すと同じコマンドが 0 で通る。
同じファイルを .ts に改名して試すと、今度は JSX が正規表現として読まれて TS1161 になり、拡張子のほうも条件であることが分かる。
Version 5.9.3$ npx tsc
src/Button.tsx(2,10): error TS17004: Cannot use JSX unless the '--jsx' flag is provided.
tsc 終了コード: 2$ npx tsc
tsc 終了コード: 0(0 なら解消)$ mv src/Button.tsx src/Button.ts$ npx tsc
src/Button.ts(2,21): error TS1161: Unterminated regular expression literal.
tsc 終了コード: 2(JSX を書くファイルは .tsx にする必要がある)— 2026-09-10 時点の出力
検証環境
- 検証日
- 実行環境
node:20Debian GNU/Linux 12 (bookworm)- バージョン
- Node.js 20.20.2
- npm 10.8.2
- Python 3.11.2
- Git 2.39.5
この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。
よくある原因
- jsx オプション未設定:
tsconfig.jsonにjsxが無いと、TypeScript は JSX の変換方法を決められずエラーになる。 - 拡張子が .ts: JSX を書くファイルは
.tsxにする必要がある。.tsのままだと山括弧が型アサーションと解釈される。 - エディタとの不一致: VS Code が使う TypeScript とプロジェクトの
tsconfig.jsonがずれていると、設定を直しても警告が残ることがある。
解決策
1. tsconfig に jsx を設定する
React 17 以降の自動ランタイムなら react-jsx を指定する。
{
"compilerOptions": {
"jsx": "react-jsx"
}
}Babel など別のツールで JSX を変換する構成なら preserve を選ぶ。
各値の違いは公式の TSConfig jsx オプション(新しいタブで開く)に一覧がある。
2. 拡張子を .tsx にする
Button.ts -> Button.tsx3. エディタの TypeScript を再読み込みする
VS Code ならコマンドパレットで「TypeScript: Restart TS Server」を実行し、設定を読み直す。