npx tsx a.ts は、TypeScript のファイルを、前もって JavaScript に書き出さずに、そのまま動かすコマンドです。tsx は「TypeScript Execute」の略で、TypeScript を動かせるように Node.js を強めた道具(npm のパッケージ)です。React のファイルの拡張子の .tsx(TSX ファイル)とは別物です。npx は、プロジェクトに入れていない npm のパッケージでも、その場で取ってきて動かすコマンドです。拡張子の違いは、.js .jsx .ts .tsx の違いの記事で説明しています。
Node.js には、型の書いてある所を空白に置き換えるだけで、.ts をそのまま動かす機能(型の取り除き)があります。node a.ts と書くだけで使え、22 系は 22.18.0 以上、24 系以降で既定で使えます。tsx と、この node a.ts は、どちらも型を調べずに動かします。ts-node は、文書では既定で型を調べてから動かす道具です。ただし、手元では ts-node 10.9.2 は TypeScript 7.0.2 を入れたフォルダーで止まりました。
Node.js の文書は、軽く動かすだけなら組み込みの型の取り除き、TypeScript の全部の機能(tsconfig.json も)が要るなら、tsx のような外のパッケージを使う、と書いています。どちらで動かしても、型の誤りは npx tsc --noEmit で別に調べます。
確かめた版は、tsx 4.23.15・ts-node 10.9.2・TypeScript 7.0.2(と 6.0.3)・Node.js 24.22.1 です。版のくらべには、Node.js 20.19.0・22.17.0・22.23.4・24.13.0 も使いました。どれも Docker の Linux で、2026年10月23日に流しました。Windows・macOS では流していません。出力に出るパスの頭は、… に省きました。出力の囲みからは、終了コードの表示と、省いたスタックの行があります(省いた所は …(スタック略) と書きました)。
npx tsxとは何か。拡張子の.tsxとは別物であること- tsx・ts-node・node の違い(型チェック・
.tsx・tsconfig.json・TypeScript 7.0.2 で動くか) - node で
.tsを動かせる版と、止まる書き方(Unknown file extension ".ts"・enum・import の書き方) - 型の誤りは動かす道具では見つからないので、
npx tsc --noEmitで別に調べること - JSX の型のエラー(TS7026・TS17004・TS1161。TypeScript がエラーごとに付けている番号です)の行き先
npx tsx とは?
tsx は TypeScript を動かす道具
tsx の文書は、tsx を「TypeScript Execute の略で、TypeScript を動かせるように Node.js を強めたもの」と説明しています。はじめは node の別名と考えて、同じように使えばよい、とも書いています。node file.js が tsx file.ts になる、という形です。
tsx の README の一文の説明は、「Node.js で TypeScript を動かすいちばん簡単な方法」です。求める Node.js は 18.0.0 以上で、中では esbuild を使い、ライセンスは MIT です(npm の登録の情報)。
名前が拡張子の .tsx と同じです。tsx の文書も「名前のせいで tsx について調べるのは難しい」と書き、「tsx で〜するには」ではなく「Node.js で〜するには」「TypeScript で〜するには」で調べるよう勧めています。
npx で、入れずに動かす
npx は、プロジェクトに入れていない npm のパッケージでも、その場で取ってきて動かすコマンドです。tsx の文書は、npx tsx ./script.ts で動かせると書いています。次の a.ts を動かしました。
const greet = (name: string): string => `Hello, ${name}`;
console.log(greet("tsx"));
$ npx tsx a.ts
npm warn exec The following package was not found and will be installed: tsx@4.23.15
Hello, tsx
$ npx tsx --version
tsx v4.23.15
node v24.22.1
1 行目の npm warn exec … は、tsx が入っていなかったので、npm が取ってきて入れた、という知らせです。
プロジェクトに入れるなら npm install -D tsx です。package.json の scripts の中では、npx を付けずに書けます。
"start": "tsx ./file.ts"
tsx は、支えのある Node.js の版すべてで動くように作られている、と文書は書いています。
tsx・ts-node・node の違いは?
くらべた表
| tsx 4.23.15 | ts-node 10.9.2 | node(型の取り除き) | |
|---|---|---|---|
| 型を調べるか | 調べない(tsx の文書)。手元でも、型の誤りのある c.ts が止まらずに動いた | 文書の既定は調べる。手元で型を調べて動いたのは、"type": "commonjs" で tsconfig.json に "module": "commonjs" を書き、6 系と 7 系を並べて入れたフォルダーのとき(→ ts-node の記事) | 調べない(Node.js の文書) |
.tsx | tsconfig.json に "jsx": "react-jsx" があれば動いた | 流していない | 動かない(文書は .tsx files are unsupported.) |
| tsconfig.json | jsx など一部の項目を読む。無くても .ts は動く | 自動で読む | 読まない |
| enum など | 流していない | 流していない | 止まる(ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX) |
| TypeScript 7.0.2 を入れたフォルダーで | 動いた | tsconfig.json の有無によらず、reading 'fileExists' で止まった | 動いた |
| 入れるもの | 入れずに npx で使える。プロジェクトには npm install -D tsx | typescript と ts-node | 何も入れない(Node.js 22.18.0 以上) |
ts-node との比べについて、tsx の文書は次のように書いています(tsx の作り手の文書なので、tsx の側から見た言い方です)。
- tsx は入れずに
npxで使えて、peer dependency(一緒に入れる必要のあるパッケージ)が無い - ts-node は、TypeScript か SWC を peer dependency として入れる
- tsx は tsconfig.json が無くても動く
上の表の「動いた」「止まった」は、手元で流した出力です。
tsx の型チェックについて、文書は「tsx は自分では型チェックをしない」と書き、tsc --noEmit を挙げて、型チェックの手順を入れるよう強く勧めています。ts-node は、README の既定では型を調べます。型の誤りのある c.ts を、"type": "commonjs" の所で TypeScript 6.0.3 を入れて動かすと、TS2322 で止まりました(このとき tsconfig.json が無いと、a.ts は何も表示せずに終わりました)。
どれを使えばいい?
- 軽く動かすだけで、型の取り除きで済む書き方(enum などを使わない)なら、
node a.tsで足ります(22 系は 22.18.0 以上、24 系以降) - TypeScript の全部の機能や tsconfig.json、
.tsxが要るなら、tsx です(Node.js の文書も、外のパッケージの例に tsx を挙げています) - ts-node を使い続けるなら、手元で型を調べて動いたのは、
"type": "commonjs"で tsconfig.json に"module": "commonjs"を書き、6 系と 7 系を並べて入れたフォルダーのときでした(ts-node の記事) - どれで動かしても、型の誤りは
npx tsc --noEmitで別に調べます
同じファイルを 3 つで動かした出力
同じ a.ts を、TypeScript 7.0.2 を入れたフォルダーで動かした結果です(Node.js 24.22.1)。
$ npx tsx a.ts
Hello, tsx
$ node a.ts
Hello, tsx
ts-node 10.9.2 は、同じフォルダーで npx ts-node a.ts を動かすと、TypeError: Cannot read properties of undefined (reading 'fileExists') で止まりました。出力の全文と、ts-node を使い続けるときの手は、ts-node の記事で説明しています。
node で .ts をそのまま動かすには?
使える版
Node.js の文書では、.ts をそのまま動かす機能(型の取り除き)の履歴は次のとおりです。
- 22 系は、22.18.0 から既定で有効です。22 の文書の安定度は「1.2 - Release candidate」(安定版の手前)です
- 24 系では既定で有効で、安定版です(23.6.0 で既定で有効、24.12.0 で安定版)
- 20 系の文書には、TypeScript の頁がありませんでした。Node.js 20 は、nodejs.org のリリースの表では EOL(支え終わり)です。Node.js の予定表(schedule.json)の終わりの日は 2026年4月30日です
型の所を空白に置き換えるだけで、型チェックはしません。止めるには --no-strip-types を付けます(24 系)。
手元で、"type": "module" の package.json があるフォルダーと、package.json の無いフォルダーで、同じ a.ts を動かした結果です。
| Node.js の版 | "type": "module" | package.json なし | npx tsx a.ts |
|---|---|---|---|
| 20.19.0 | ERR_UNKNOWN_FILE_EXTENSION | SyntaxError: Unexpected token ':' | 動いた |
| 22.17.0 | ERR_UNKNOWN_FILE_EXTENSION(--experimental-strip-types を付けると動く) | SyntaxError: Unexpected token ':' | 動いた |
| 24.13.0 | 動いた | 動いた | 動いた |
node a.ts で Unknown file extension ".ts" と出たら
ここで説明するのは、node で出る場合です。Node.js 20.19.0 で、"type": "module" のフォルダーの a.ts を動かすと、次の文で止まります。
$ node -v
v20.19.0
$ node a.ts
node:internal/modules/esm/get_format:189
throw new ERR_UNKNOWN_FILE_EXTENSION(ext, filepath);
^
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for …/esm/a.ts
code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
Node.js v20.19.0
22.17.0 でも同じ文でした。22.17.0 は、--experimental-strip-types を付けると動きます。Node.js 20.19.0 は、このフラグを受け付けず、node: bad option: --experimental-strip-types と出ました。
$ node -v
v22.17.0
$ node --experimental-strip-types a.ts
Hello, tsx
(node:31) ExperimentalWarning: Type Stripping is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
直し方は、Node.js を 22.18.0 以上に上げるか、tsx で動かすことです。手元では、npx tsx a.ts は 20.19.0・22.17.0・24.13.0 のどれでも動きました。
package.json の無いフォルダーでは、Unknown file extension ではなく、SyntaxError: Unexpected token ':' で止まりました(型の注釈の : のところ)。
.ts を ES モジュールとして読むか、CommonJS として読むかは、.js と同じ決め方です(Node.js 24 の文書)。近くの package.json の "type": "module" で決まります。決め方は、ESM と CommonJS の記事で説明しています。
ts-node の場合は、別の話です。ts-node では、Node.js 24.22.1 の既定では ERR_UNKNOWN_FILE_EXTENSION は出ず、NODE_OPTIONS=--no-strip-types を付けると出ました。詳しくは、ts-node の記事の「"type": "module" のプロジェクトでは」の節で説明しています。
.tsx は動かない
Node.js の文書は、22・24・26 のどれでも .tsx files are unsupported. と書いています(26 は文書だけを見ました。26 では流していません)。Node.js 24.22.1 で、import のある .tsx を動かすと、次の文で止まりました。
$ node b.tsx
node:internal/modules/esm/get_format:243
throw new ERR_UNKNOWN_FILE_EXTENSION(ext, filepath);
^
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".tsx" for …/b.tsx
…(スタック略)
code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
Node.js v24.22.1
import の無い .tsx は、SyntaxError: Unexpected token ':' で止まりました。文が 2 とおりに分かれる理由は、確かめていません。どちらも、動かないことは同じです。.tsx を動かしたいときは、tsx を使います(あとの FAQ を見てください)。
型を消すだけでは済まない書き方(enum など)
Node.js は、型の所を消すだけです。enum・実行時のコードを持つ namespace・パラメータプロパティ(constructor(public x: number))・import の別名のように、型を消すだけでは JavaScript にならない書き方は、エラーになります(Node.js の文書)。Node.js 24.22.1 で enum を動かすと、次のとおりです。
enum Color { Red, Green }
console.log(Color.Green);
$ node enum.ts
file:///…/enum.ts:1
enum Color { Red, Green }
^^^^^^^^^^^^^^^^^^^^^^^^^
console.log(Color.Green);
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: TypeScript enum is not supported in strip-only mode
code: 'ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX'
}
Node.js v24.22.1
値のある namespace は SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: TypeScript namespace declaration is not supported in strip-only mode、パラメータプロパティは … TypeScript parameter property is not supported in strip-only mode で止まりました。Node.js 22.23.4 でも、文は同じでした。
Node.js の文書には、これらを変換する試験中のフラグも載っています。ただし、Node.js 26.0.0 で無くなったので、この記事では使い方を書きません。
TypeScript の側では、erasableSyntaxOnly という設定が、消すだけで済まない書き方をエラーにします。Node.js の文書は、型の取り除きを使うときに、TypeScript 5.8 以上と、erasableSyntaxOnly・verbatimModuleSyntax などの設定を勧めています。Vite の react-ts のひな形の tsconfig.app.json にも、"erasableSyntaxOnly": true が入っています。erasableSyntaxOnly のエラーの文は、この記事では流していません。
import の書き方(type と拡張子)
型を import するときは、type を付けます。付けないと、値の import として扱われて、実行時のエラーになります。また、import にはファイルの拡張子が要ります(import './file.ts')。ほかのファイルの user.ts から、型の User と関数の hello を import した結果です。
$ node import-notype.ts
file:///…/import-notype.ts:1
import { User, hello } from "./user.ts";
^^^^
SyntaxError: The requested module './user.ts' does not provide an export named 'User'
Node.js v24.22.1
$ node import-type.ts
Hello, Node
$ node import-noext.ts
node:internal/modules/esm/resolve:272
throw new ERR_MODULE_NOT_FOUND(
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '…/user' imported from …/import-noext.ts
code: 'ERR_MODULE_NOT_FOUND',
url: 'file:///…/user'
}
Node.js v24.22.1
import-type.ts は import { type User, hello } from "./user.ts"; と type を付けた形で、import-noext.ts は import { hello } from "./user"; と拡張子を書かない形です。
node_modules の中の .ts は、Node.js は動かしません。ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING のエラーになります(TypeScript のまま公開するのを勧めないため、と文書は書いています)。
型チェックはどうする?
tsx も、node の型の取り除きも、型を調べません。型の誤りのある c.ts(const n: number = "not a number";)は、どちらも止まらずに動きました。
$ npx tsx c.ts
not a number
$ node c.ts
not a number
型は、npx tsc --noEmit で別に調べます。tsconfig.json の無いフォルダーで、ファイル名を渡して調べた結果です(TypeScript 7.0.2)。
$ npx tsc --noEmit c.ts
c.ts(1,7): error TS2322: Type 'string' is not assignable to type 'number'.
tsconfig.json のあるフォルダーでは、ファイル名を渡さずに npx tsc --noEmit と書きます。ファイル名を渡すと、TypeScript 6.0 から TS5112 で止まります。理由と直し方は、Cannot use JSX unless the '--jsx' flag is provided の直し方の「書いたのに出るのはなぜ?」の節で説明しています。
JSX・React の型のエラーは?
.tsx を TypeScript で調べるときのエラーは、次の 3 本にまとめています。
error TS7026: JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists.は、JSX element implicitly has type 'any' の原因と直し方で説明していますerror TS17004: Cannot use JSX unless the '--jsx' flag is provided.は、Cannot use JSX unless the '--jsx' flag is provided の直し方で説明していますerror TS1161: Unterminated regular expression literal.は、.tsに JSX を書いたときにも出ます。Unterminated regular expression literal の原因と直し方で説明しています
よくある質問
ts-node から tsx に替えるとき、気をつけることは?
型を調べなくなる点です。ts-node は、文書では既定で型を調べますが、tsx は調べません。替えたあとは、npx tsc --noEmit で型を別に調べます。ts-node が TypeScript 7.0.2 で止まる話と、替え方は、ts-node の記事で説明しています。
package.json の scripts には、どう書きますか?
tsx をプロジェクトに入れて(npm install -D tsx)、scripts の中では npx を付けずに書きます。tsx の文書の例は、"start": "tsx ./file.ts" です。
Node.js 22 でも node a.ts は使えますか?
22.18.0 以上なら、既定で使えます。22.17.0 では、--experimental-strip-types を付けると動きました(警告が出ます。それより前の 22 系では流していません)。止めるフラグの名前は、24 系が --no-strip-types(24.12.0 で --no-experimental-strip-types から変わりました)、22 系の文書が --no-experimental-strip-types です。Node.js 22.23.4 では、--no-strip-types は node: bad option: --no-strip-types と出ました。
tsx は tsconfig.json が無くても動きますか?
.ts は動きます。.tsx は、tsconfig.json に "jsx": "react-jsx" が無いと、ReferenceError: React is not defined で止まりました。tsx は、.jsx・.tsx では、tsconfig.json の jsx などを読みます。次の b.tsx を、react 19.3.1 と react-dom 19.3.1 を入れたフォルダーで動かした結果です。
import { renderToStaticMarkup } from "react-dom/server";
const Hello = ({ name }: { name: string }) => <h1>Hello, {name}</h1>;
console.log(renderToStaticMarkup(<Hello name="TSX" />));
$ npx tsx b.tsx
…/b.tsx:5
console.log(renderToStaticMarkup(<Hello name="TSX" />));
^
ReferenceError: React is not defined
…(スタック略)
Node.js v24.22.1
tsconfig.json に "jsx": "react-jsx" を書くと、動きました。流したときの tsconfig.json は次のとおりです。
{ "compilerOptions": { "jsx": "react-jsx", "module": "esnext", "moduleResolution": "bundler", "strict": true, "noEmit": true } }
$ npx tsx b.tsx
<h1>Hello, TSX</h1>
まとめ
npx tsx a.tsは、TypeScript のファイルをそのまま動かすコマンドです。tsx は npm のパッケージで、拡張子の.tsxとは別物です- tsx と node の型の取り除きは、型を調べずに動かします。ts-node は文書の既定では型を調べますが、10.9.2 は TypeScript 7.0.2 のフォルダーで止まりました。型は
npx tsc --noEmitで別に調べます - node で
.tsを動かせるのは、22.18.0 以上と 24 系です。それ以前の版ではUnknown file extension ".ts"などで止まり、enum・値のある namespace・パラメータプロパティも止まります。.tsxは node では動きません .tsxを動かすなら tsx を使い、tsconfig.json に"jsx": "react-jsx"を書きます- この記事で確かめていないこと: Node.js 26 で流すこと(文書だけ)、Windows・macOS、
erasableSyntaxOnlyのエラーの文
参考資料
- tsx の文書(トップ)
- tsx の文書: はじめに(npx で動かす・プロジェクトに入れる)
- tsx の文書: TypeScript(型チェックと tsconfig)
- tsx の文書: よくある質問(ts-node とのくらべ)
- Node.js の文書: TypeScript を動かす(v24)
- Node.js の文書: TypeScript を動かす(v22)
- Node.js のリリースの表
- ts-node の README(GitHub)
- TypeScript の文書: erasableSyntaxOnly
※この記事は、2026年10月23日時点の公式の資料と照らして確かめています。誤りに気づいたらお問い合わせからお知らせください。



