[Jest] テスト実行時に「ts-jest[config] (WARN) There is a mismatch between your NodeJs version v12.14.0 and your TypeScript target ES2020.」という警告が出るので対処する

2021.08.22

こんにちは、CX事業本部 IoT事業部の若槻です。

Jestは、JavaScriptのテスティングフレームワークです。

今回は、Jestでのテスト実行時にts-jest[config] (WARN) There is a mismatch between your NodeJs version v12.14.0 and your TypeScript target ES2020.という警告が出るので対処した話です。

テストの実行で警告が出る

TypeScriptのプロジェクトでJestのテストを実行すると、テスト実行自体は行われますが、ts-jest[config] (WARN) 〜という警告が出力されました。

$ npx jest ./test/writeDataToFile.test.ts
ts-jest[config] (WARN) There is a mismatch between your NodeJs version v12.14.0 and your TypeScript target ES2020. This might lead to some unexpected errors when running tests with `ts-jest`. To fix this, you can check https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping
 PASS  test/writeDataToFile.test.ts
  ✓ 画像データをローカルファイルに書き込む (4 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.753 s
Ran all test suites matching /.\/test\/writeDataToFile.test.ts/i.

警告文を抜き出したのが下記です。

ts-jest[config] (WARN) There is a mismatch between your NodeJs version v12.14.0 and your TypeScript target ES2020. This might lead to some unexpected errors when running tests with ts-jest. To fix this, you can check https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping

字義通りに読むと、下記2点の環境の状態がミスマッチであるため、ts-jestでのテスト実行時に予期せぬエラーが起きる可能性があるとのことです。

  • Node.jsのバージョンが12.14.0
  • TypeScriptターゲットがES2020

Node Target Mapping

警告にあったURLリンクhttps://github.com/microsoft/TypeScript/wiki/Node-Target-Mappingによると、TSConfig(tscongig.json)でのコンパイラオプション設定はNode.jsのバージョンごとに下記のようにマッピングさせるのが推奨とのことです。このNode Target Mappingに従うことにより不必要なコンパイルを抑えることができるようになります。

  • Node14

tscongig.json

{
  "compilerOptions": {
    "lib": ["ES2020"],
    "module": "commonjs",
    "target": "ES2020"
  }
}
  • Node12

tscongig.json

{
  "compilerOptions": {
    "lib": ["ES2019"],
    "module": "commonjs",
    "target": "ES2019"
  }
}
  • Node10

tscongig.json

{
  "compilerOptions": {
    "lib": ["es2018"],
    "module": "commonjs",
    "target": "es2018"
  }
}

原因、対処

では今回のプロジェクトの環境はというと、Nodeバージョンは12であるのに対して、コンパイラ設定はNode14向けとなっており、Node Target Mappingに反しています。これが今回のテスト実行時の警告の原因のようです。

$ node --version
v12.14.0

tscongig.json

{
  "compilerOptions": {
    "lib": ["ES2020"],
    "module": "commonjs",
    "target": "ES2020"
  }
}

対処その1

Nodeバージョンを12.14.0のまま変更せず、コンパイラ設定をNode12向けに変更してみます。

tscongig.json

{
  "compilerOptions": {
    "lib": ["ES2019"],
    "module": "commonjs",
    "target": "ES2019"
  }
}

するとJestのテストを実行しても警告は出なくなりました。

対処その2

今度は逆に、コンパイラ設定をNode14向けのまま変更せず、Nodeバージョンを14に変更してみます。

Nodeのバージョン管理はnodenvを利用しています。現在インストールされているNodeバージョンは12.14.0のみです。

$ nodenv versions
  system
* 12.14.0 (set by /Users/wakatsuki.ryuta/.node-version)

nodenvでNode14.5.0をインストールします。

$ nodenv install 14.5.0
$ nodenv versions
  system
* 12.14.0 (set by /Users/wakatsuki.ryuta/.node-version)
  14.5.0

globalで14.5.0にしてみます。

$ nodenv global 14.5.0

しかし12.14.0のまま変わりませんでした。

$ nodenv versions
  system
* 12.14.0 (set by /Users/wakatsuki.ryuta/.node-version)
  14.5.0

調べてみると下記の記事が参考になりました。rootの.node-versionを削除する必要があるようです。

rootの.node-versionを削除します。

$ rm /Users/wakatsuki.ryuta/.node-version

Nodeバージョンが切り替わりました。

$ nodenv version
14.5.0 (set by /Users/wakatsuki.ryuta/.nodenv/version)
$ node --version
v14.5.0

するとJestのテストを実行しても警告は出なくなりました。

おわりに

Jestでのテスト実行時にts-jest[config] (WARN) There is a mismatch between your NodeJs version v12.14.0 and your TypeScript target ES2020.という警告が出るので対処した話でした。

「ビルド、デプロイはCI/CD環境で最終的に行われるので開発環境のNodeバージョンなどはあまり気を使わなくていいや」というルーズさを見透かされた気がしました。

参考

以上