Node.jsの型
実は、Node.js自体にも型がないです。そのため、TypeScriptでNode.jsのモジュール群を利用したい場合は、Node.jsの型を導入する必要があります。Node.jsの型は、次のコマンドで導入できます。
npm install --save @types/node
それでは少し、TypeScriptとNode.jsを使ったプログラムを書いてみましょう。
実践1:Node.jsプロジェクトに型定義を追加する
サンプルのプロジェクトを作ります。package.json
はnpm init -y
で作り、手動で修正します。また、tsconfig.json
はnpx tsc --init
で作り、手動で修正します。そして、フォルダーやファイルを次のような構成にします。
▶ファイル構成
-
プロジェクトのルート/
- dist/
-
src/
- index.ts
- package.json
- tsconfig.json
package.json
の中身を示します。
{ "name": "with_node", "version": "1.0.0", "main": "dist/index.js", "type": "module", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "description": "" }
tsconfig.json
の中身を示します。
{ "compilerOptions": { "target": "ES2024", "module": "ESNext", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "rootDir": "./src", "outDir": "./dist", "moduleResolution": "node", }, "include": ["src"] }
そしてindex.ts
に、次のようなコードを書きます。
import fs from "node:fs"; let t = fs.readFileSync("tsconfig.json", 'utf8'); let lines = t.replace(/\n/g, '').split("\n"); lines = lines.slice(0, 3); lines.forEach(line => console.log(line));
シンプルなコードですが、最初の行のnode:fs
と、最後の行のline
にエラーが表示されます。
エラーの内容は、最初の行のnode:fs
は、Cannot find module 'node:fs' or its corresponding type declarations.
(モジュール 'node:fs' またはそれに対応する型宣言が見つかりません。)です。
最後の行のline
は、Parameter 'line' implicitly has an 'any' type.
(パラメータ 'line' は暗黙的に 'any' タイプを持ちます。)です。
処理の基点であるfs.readFileSync
に戻り値の型がないためにany型と見なされ、後続の全ての処理がany型として処理されているのが原因です。
それでは、このプロジェクトにNode.jsの型を導入しましょう。プロジェクトのルートでターミナルを開き、次のコマンド実行します。
npm install --save @types/node
node_modules/@types/node
の中に型定義ファイルがダウンロードされて利用可能になります。
先ほどのコードのfs.readFileSync
にマウスカーソルを重ねてください。戻り値の型注釈が: string
になっています。また、line
にマウスカーソルを重ねると(parameter) line: string
と表示されて、型を正しく推論されるようになったのが分かります。
実践2:型定義が同梱されたパッケージを利用する
続いてきちんと型定義があるパッケージを導入して利用してみましょう。日時を扱うdayjsをインストールします。
npm install dayjs --save
そして、src/index.ts
の末尾に次のコードを足します。
import dayjs from 'dayjs'; const now: dayjs.Dayjs = dayjs(); const formatted: string = now.format('YYYY-MM-DD'); console.log(formatted);
dayjs()
の戻り値として、dayjs.Dayjs
型の値が取得でき、安全に処理をおこなえることが分かります。
node_modules/dayjs/package.json
を見てみましょう。抜粋して掲載します。
"main": "dayjs.min.js", "types": "index.d.ts",
main
で指定されているエントリーファイルとは別に、types
で型定義ファイルを書いているのが分かります。
このように、型定義がないなら追加でインストールして、型定義があるならそのまま利用できます。
@typesで適切な型がない場合は、前回作成したように自作することも可能です。