[Node.js][TypeScript] プライベートなモジュールの共有でモジュールを作ってみたんだけど、これだとソースコードが1つのファイルにしないといけないことになってしまう・・・

普通は、クラスごととかにわけて複数ファイルで構成されているもんだろうから、それをやってみる。

例として、複数ファイルで構成されているモジュールをcommonという名前で作る。

commonディレクトリを作って、そこでnpm initを実行して、package.jsonを適当に作る。
このモジュールは公開しないので念のためprivateフィールドをtrueで追加する。TypeScriptの場合、typesフィールドを追加して、モジュールの型情報ファイルを指定する。

{
  "name": "common",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "types": "index.d.ts",
  "private": true,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

つぎにTypeScriptの準備。

tsc --initを実行して、tsconfig.jsonを作成する。tsconfig.jsoでdeclarationをtrueにするとtsc実行時に型情報ファイルも生成されるようになるので指定する。

複数のソースファイル、Hoge1.ts、Hoge2.tsを用意する。

Hoge1.ts

export class Hoge1 {
    public name:string = "hoge1";
}

Hoge2.ts

export class Hoge2 {
    public name:string = "hoge2";
}

export class Hoge3 {
    public name:string = "hoge3";
}

package.jsonでmainとtypesに1つのファイルしか指定できないんで、index.tsでHoge1.ts、Hoge2.tsをインポートしてそれをエクスポートするようにする。型情報ファイルは、tsc実行で出力するように設定したのでそれを使う。

index.ts

export { Hoge1 } from "./Hoge1";            // Hoge1のクラスHoge1をエクスポートする。
export * from "./Hoge2";                    // Hoge2でエクスポートしているものを全部エクスポート
export { Hoge1 as Hoge4} from "./Hoge1";    // Hoge1のクラスHoge1をHoge4としてエクスポート

これで、tscを実行して、index.js、index.d.ts 生成する。

これでモジュールのほうは完成。

次は使う方だ。

commonディレクトリと同列(隣)にtestと言うディレクトリを作って、そこを使うことにする。 npm inittsc --initでpackage.json、tsconfig.jsonを作成する。

npm install ../common --save

を実行して、commonモジュールをインストールする。testプロジェクトのnode_modulesフォルダにシンボリックリンクされる。

commonモジュールを使うコードはこんな感じになる。

test.ts

import * as t from "common";

const hoge1 = new t.Hoge1();
const hoge2 = new t.Hoge2();
const hoge3 = new t.Hoge3();
const hoge4 = new t.Hoge4();

console.log(hoge1.name);    // "hoge1"と表示
console.log(hoge2.name);    // "hoge2"と表示
console.log(hoge3.name);    // "hoge3"と表示
console.log(hoge4.name);    // "hoge1"と表示

[Node.js][TypeScript] プライベートなモジュールの共有でpackage.jsonにcommonが絶対パスで保存されるって書いているけど、今のバージョンnpm(v6.1.0))では相対パスになっている。