TypeScriptでは、モジュールのインストールパスにエイリアス(alias)が使えます。 通常のモジュールインポートでは、相対パスで指定しますが、エイリアスを使うとエイリアスのパスを親ディレクトリとして指定できます。
例えば、インポートするモジュールが、以下で
src/lib/Security.ts以下のファイルが、上記モジュールをインポートする場合
src/service/AppService.ts
通常 AppService.ts は、相対パスでSecurityモジュールを指定します。 srcディレクトリをエイリアス@srcと設定している場合、エイリアスからのパスで指定できます。
import { Security } from '../../lib/Security'; // 通常の指定
import { Security } from '@src/lib/Security'; // エイリアス@srcを使った指定
ただし、これを使うためには、環境に併せて追加の設定が必要になります。 ここでは、その設定方法についての説明します。
TypeScript
TypeScriptの設定ファイルtsconfig.jsonでは、baseUrl と paths を使って指定できます。 pathsは複数指定できて、1つの指定は以下のようになります。
"エイリアス名/*": ["baseUrlからのパス/*"]エイリアス名は、"@src" や "~src" など先頭に "@" や "~" の記号をつけている例をよく見ます。
{
"compilerOptions": {
...
"baseUrl": "./",
"paths": {
"@src/*": ["src/*"],
"@lib/*": ["src/lib/*"]
}
...
}
}
src/server/app.ts が、 src/lib/Security.ts をインポートする場合、通常は以下のようになります。
import { Security } from '../../lib/Security';
pathsで指定したエイリアスを使う場合は、以下のようになります。
import { Security } from '@src/lib/security';
または
import { Security } from '@lib/security';
ts-node、ts-node-dev
開発で使用する ts-node や ts-node-dev は、tsconfig.jsonで設定したエイリアスを認識せず、以下のようなエラーが発生します。
Error: Cannot find module '@src/lib/util/DateUtil'
このエラーを回避するためには、tsconfig-paths モジュールをインストールします。
npm i -D tsconfig-paths
インストールが完了したら、ts-node や ts-node-dev にオプション "-r tsconfig-paths/register" を追加します。
例 package.json
{
"scripts": {
"server": "ts-node-dev -r tsconfig-paths/register src/app.ts",
...
},
...
}
jest
ユニットテストでjestを使う場合、jestの設定ファイル(jest.config.js) に、エイリアス用設定の moduleNameMapper を追加する必要があります。
例 jest.config.js
module.exports = {
...
preset: 'ts-jest',
moduleNameMapper: {
'^@src/(.*)$': '<rootDir>/src/$1',
'^@lib/(.*)$': '<rootDir>/src/lib/$1'
},
...
}
注 jestでTypeScriptを使うため、ts-jest モジュールを使っています。