Node.js v23.6.0：TypeScriptサポートが登場

[![表紙](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/920acfaa-7622-9deb-937f-c4960b3ee959.png)](https://leapcell.io/?lc_t=q_nodets)

Node.js v23.6.0 が[最近リリース](https://nodejs.org/en/blog/release/v23.6.0)され、大きなアップデートとして `--experimental-strip-types` フラグが解除されました。これにより、Node.js は追加の設定なしで TypeScript ファイルをネイティブに実行できるようになりました。

## TypeScript の重要性

TypeScript は、JavaScript にオプションの静的型付けやインターフェース、ジェネリクス、型推論などの高度な機能を追加することで、JavaScript を拡張します。これにより、大規模な JavaScript アプリケーションのデファクトスタンダードとなっています。今回の Node.js への統合により、TypeScript はバックエンド開発者にとってさらに利用しやすくなりました。

## Node.js で TypeScript を実行する方法

TypeScript ファイルを Node.js で実行するには、次のコマンドを使用します：

```bash
node index.ts
```

Node.js は`.ts`ファイルに加えて、`.mts`および`.cts`ファイルもサポートしていますが、`.tsx`はサポートされていません。

### Node.js による TypeScript の実行方法

Node.js は、`swc`のバージョンを使用して型注釈を取り除き、実行可能な純粋な JavaScript コードに変換します。

## Node.js で TypeScript を実行する際の注意点

### ローカルインポートは TypeScript ファイルを参照する必要がある

バンドラなしで TypeScript を使用する場合、以前は以下のようなインポートを書いていたかもしれません：

```ts
import { myFunction } from './my-module.js';
```

これを `from './my-module.ts'` に書き換える必要があります。

なぜでしょうか？TypeScript コンパイラはモジュールの拡張子（例：`'./my-module.js'`）を変更しないため、トランスパイル後の JavaScript 出力と一致する拡張子を使用する必要がありました。

しかし、Node.js はモジュールの種類を拡張子で判別するため、インポートで明示的に TypeScript ファイルを指定する必要があります：

```ts
import { myFunction } from './my-module.ts';
```

この変更は、Node.js がモジュールの種類を拡張子で判別する仕組みに依存しているため必要です。これに対し、TypeScript コンパイラは以前、モジュール指定子（例：`'./my-module.js'`）をそのまま保持していました。

### 型チェックはビルトインではない

Node.js は TypeScript ファイルを実行する際に型チェックを行いません。型の安全性を確保するには、ローカルで TypeScript コンパイラ（`tsc`）や類似ツールを実行する必要があります。例えば：

```bash
tsc --watch
```

さらに、型チェックとコーディングの一貫性を保つために、`tsconfig.json`を正しく設定することが重要です：

```json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "nodenext",
    "allowImportingTsExtensions": true,
    "rewriteRelativeImportExtensions": true,
    "verbatimModuleSyntax": true
  }
}
```

- **[`allowImportingTsExtensions`](https://www.typescriptlang.org/tsconfig/#allowImportingTsExtensions):** `.ts`ファイルを直接インポート可能にします。
- **[`rewriteRelativeImportExtensions`](https://devblogs.microsoft.com/typescript/announcing-typescript-5-7/#path-rewriting-for-relative-paths):** `.ts`ファイルから`.js`ファイルへの相対インポートを再書き換えします。
- **[`verbatimModuleSyntax`](https://www.typescriptlang.org/tsconfig/#verbatimModuleSyntax):** 型をインポートする際に`type`キーワードを使用しない場合、警告を出します。

### 型のインポートには`type`キーワードが必要

型をインポートする際には`type`キーワードが必要です。これを省略すると、型ストリッピングが適用されません。

```ts
// 型のインポート
import type { Item } from './my-module.ts';

// インライン型インポート
import { myFunction, type Item } from './my-module.ts';
```

## Node.js で TypeScript を実行する際の制限

### 非 JavaScript 言語機能のサポートはなし

TypeScript 固有のいくつかの機能はサポートされていません：

- 列挙型（Enums）
- 名前空間（Namespaces）
- クラスコンストラクタのパラメータプロパティ

これらの機能を有効にするには、`--experimental-transform-types`フラグを追加してください。

### TypeScript がもたらす将来の JavaScript 機能のサポートなし

TypeScript は、デコレーターのような将来の JavaScript 機能を現在のエンジン上で動作可能にするトランスパイルを提供します。

しかし、Node.js は TypeScript の型のみをストリップするため、このような機能はサポートされません。

## 古い Node.js バージョンで TypeScript を実行できるか？

[X の Marco](https://x.com/satanacchio/status/1872426617039114243)によると、TypeScript サポートは Node.js v22 にも導入予定ですが、v20 には導入されません。

## 参考

- [Node’s New Built-in Support for TypeScript](https://2ality.com/2025/01/nodejs-strip-type.html)
- [Node.js Now Supports TypeScript by Default](https://www.totaltypescript.com/typescript-is-coming-to-node-23)

---

### [私たちはLeapcell、Node.jsプロジェクトのクラウドデプロイの最適解です。](https://leapcell.io/?lc_t=q_nodets)

[![Leapcell](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/9157c7cb-fe9f-7173-ec92-d986ea6b9464.png)](https://leapcell.io/?lc_t=q_nodets)

[Leapcell](https://leapcell.io/?lc_t=q_nodets)は、Webホスティング、非同期タスク、Redis向けの次世代サーバーレスプラットフォームです：

**複数言語サポート**

- Node.js、Python、Go、Rustで開発できます。

**無制限のプロジェクトデプロイ**

- 使用量に応じて料金を支払い、リクエストがなければ料金は発生しません。

**比類のないコスト効率**

- 使用量に応じた支払い、アイドル時間は課金されません。
- 例: $25で6.94Mリクエスト、平均応答時間60ms。

**洗練された開発者体験**

- 直感的なUIで簡単に設定できます。
- 完全自動化されたCI/CDパイプラインとGitOps統合。
- 実行可能なインサイトのためのリアルタイムのメトリクスとログ。

**簡単なスケーラビリティと高パフォーマンス**

- 高い同時実行性を容易に処理するためのオートスケーリング。
- ゼロ運用オーバーヘッド — 構築に集中できます。

[ドキュメントで詳細を確認！](https://docs.leapcell.io/)

[![Try Leapcell](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/93135fa7-a20e-3e50-078a-9518ad1360c8.png)](https://leapcell.io/?lc_t=q_nodets1)

Xでフォローする：[@LeapcellHQ](https://x.com/LeapcellHQ)