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" など先頭に "@" や "~" の記号をつけている例をよく見ます。

例 tsconfig.json のあるディレクトリを baseUrlに指定して、pathsでソースディレクトリ(src) や、ライブラリディレクトリ(src/lib)のエイリアスを設定する場合
{
  "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-nodets-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 モジュールを使っています。