$ ryokkkke.com/TypeScript/tsconfig.json

exclude

概要

"exclude": ["node_modules"]

コンパイルする対象から除外するファイルを記述します。
includeと同じワイルドカードが使えます。

このオプションは指定しない場合、デフォルトで以下の値を含みます。

  • node_modules
  • bower_components
  • jspm_packages
  • outDirオプションで指定しているディレクトリ配下のファイル

逆に言うと、tsconfig.jsonに明示的にこのオプションが指定されている場合は、上記のデフォルト値が指定されなくなるので注意が必要です。

詳しく

$ npx tsc -v
Version 4.0.3
{
  "compilerOptions": {
    "outDir": "./dist",
    "allowJs": true
  },
  "exclude": ["node_modules"]
}
src/
└── hoge.ts

となっているとしましょう。

この状態でtscコマンドを叩くと、1 回目は成功します。

src/
└── hoge.ts
dist/
└── hoge.js

これは想定通りだと思いますが、この状態でもう一回叩くと下記のようなエラーが出ます。

src/hoge.ts:1:7 - error TS2451: Cannot redeclare block-scoped variable 'hoge'.

1 const hoge: string = "hoge";
        ~~~~

  dist/hoge.js:2:5
    2 var hoge = "hoge";
          ~~~~
    'hoge' was also declared here.


Found 1 error.

ディレクトリ構造を見るとなんかすごいことになっています。

src/
└── hoge.ts
dist/
├── dist
│   └── hoge.js
├── hoge.js
└── src
    └── hoge.js

これはつまり上述の通り、明示的にexcludenode_modulsのみを指定した影響で、outDirに指定されているディレクトリ(今回で言うとdist)がexcludeのデフォルト指定から外れてしまったためです。
そしてallowJstrueになっているので、コンパイル結果であるhoge.jsもコンパイル対象になってしまったんですね。

それでもexcludeに明示的に指定する必要がある場合は純粋にoutDirに指定しているファイルも明示的に指定すれば解決です。

{
  "compilerOptions": {
    "outDir": "./dist",
    "allowJs": true
  },
  "exclude": ["node_modules", "dist"] // <- dist を足した
}

これで正常にコンパイルできるようになります。

files と include と exclude の適用順番

簡単に言うと優先順位はfiles > exclude > include

includeで指定されたファイルはexcludeで除外されるが、filesに指定したファイルはexcludeに関係なく問答無用でコンパイル対象になる。

また、このルールによってコンパイル対象になったファイルが参照するファイルもコンパイル対象に含まれる。


関連オプション:filesincludeoutDir