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で適切な型がない場合は、前回作成したように自作することも可能です。
