できない.dev

TypeScript「Cannot use JSX unless the '--jsx' flag is provided」の原因と直し方

Cannot use JSX unless the '--jsx' flag is provided は、tsconfig の jsx を設定すれば直る。
TS17004 として出る。
JSX を含むファイルは拡張子も .tsx にする。

公開: 更新:

症状できない · exit 2
npx tsc
src/Button.tsx(2,10): error TS17004: Cannot use JSX unless the '--jsx' flag is provided.
解決後できた · exit 0
npx tsc

2026-10-25 に node:20(TypeScript 5.9.3 / Node.js 20.20.2) で実際に打って取った出力。検証環境の詳細

要約

このエラー(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.
$ echo $?
2
$ npx tsc
$ echo $?
0
$ mv src/Button.tsx src/Button.ts
$ npx tsc
src/Button.ts(2,21): error TS1161: Unterminated regular expression literal.
$ echo $?
2

— 2026-10-25 時点の出力

検証環境Node.js 20.20.2 / npm 10.8.2 / Python 3.11.2 / 2026-10-25 検証(ほか 2 件)
検証日
実行環境
node:20 Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 20.20.2
  • npm 10.8.2
  • Python 3.11.2
  • Git 2.39.5
  • TypeScript 5.9.3

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

解決策

1. tsconfig に jsx を設定する

React 17 以降の自動ランタイムなら react-jsx を指定する。

{
  "compilerOptions": {
    "jsx": "react-jsx"
  }
}

Babel など別のツールで JSX を変換する構成なら preserve を選ぶ。
各値の違いは公式の TSConfig jsx オプション(新しいタブで開く)に一覧がある。

2. 拡張子を .tsx にする

Button.ts  ->  Button.tsx

3. エディタの TypeScript を再読み込みする

VS Code ならコマンドパレットで「TypeScript: Restart TS Server」を実行し、設定を読み直す。

よくある原因

  1. jsx オプション未設定: tsconfig.json に jsx が無いと、TypeScript は JSX の変換方法を決められずエラーになる。
  2. 拡張子が .ts: JSX を書くファイルは .tsx にする必要がある。.ts のままだと山括弧が型アサーションと解釈される。
  3. エディタとの不一致: VS Code が使う TypeScript とプロジェクトの tsconfig.json がずれていると、設定を直しても警告が残ることがある。