Node.js で「ERR_UNKNOWN_FILE_EXTENSION: Unknown file extension ".ts"」が解決できない
古い Node で `.ts` を直接実行すると拡張子を解釈できずこのエラーになる。
`tsx` などのランナーで実行するか、型除去が既定の新しい Node(v22.18 / v23.6 以降)にする。
公開: 更新:
要約
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" は、Node.js が .ts ファイルをどう扱えばよいか分からないときに出ます。
Node はもともと JavaScript の実行環境で、TypeScript をそのまま動かす仕組みは新しいバージョンで段階的に入りました。
古い Node で node app.ts を実行するとこのエラーになります。
最も確実なのは tsx などのランナーを使うことです。
新しい Node なら型を取り除いて直接実行できます。
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /path/to/app.tsよくある原因
- TypeScript を直接実行:
node app.tsのように、JavaScript への変換やランナーを介さず実行している。 - Node のバージョンが古い: 型除去(type stripping)に未対応の Node を使っている。
- ローダー未指定: ESM 環境で
.tsを解釈するローダー/ランナーを指定していない。 ts-nodeの ESM 設定不整合:"type": "module"環境で loader の指定が噛み合っていない。
解決策
1. tsx で実行する(バージョン非依存で確実)
tsx は TypeScript をそのまま実行できるランナーです。
Node のバージョンに関係なく動くため、手っ取り早く確実です。
npx tsx app.ts2. 新しい Node の型除去を使う
公式ドキュメントによると、Node.js は v23.6.0 / v22.18.0 以降、消去可能な TypeScript 構文を含むファイルを既定で実行できます(型は除去されるだけで型チェックは行われません)。
これらのバージョンに更新すれば、追加ツール無しで動きます。
node --version # v23.6.0 / v22.18.0 以降かを確認
node app.tsv22.6.0 から v22.17 など型除去が既定で無効な系列では、フラグを付けて有効化します。
node --experimental-strip-types app.tsなお enum や実行コードを伴う namespace のように変換が必要な構文は、型除去だけでは動かず ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX になります。
その場合は tsx や事前コンパイルを使います。
3. 事前に tsc でコンパイルする
ビルド成果物を Node で動かす構成なら、tsc で JavaScript に変換してから生成物を実行します。
本番ではこの形が無難です。
npx tsc
node dist/app.js