## 事象
[[pnpm]]を使って[[Jest]]をインストールしたとき、[[TypeScript]]のテストを実行すると以下のエラーになる。
```error
index.test.ts:1:30 - error TS2307: Cannot find module '@jest/globals' or its corresponding type declarations.
1 import { test, expect } from "@jest/globals";
~~~~~~~~~~~~~~~
```
### 再現手順
```bash
mkdir pnpm-jest-sandbox
cd $_
pnpm add -D typescript jest
pnpm add -D babel-jest @babel/core @babel/preset-env @babel/preset-typescript
cat >babel.config.js << 'EOF'
module.exports = {
presets: [
['@babel/preset-env', {targets: {node: 'current'}}],
'@babel/preset-typescript',
],
};
EOF
cat >index.test.ts << 'EOF'
import { test, expect } from "@jest/globals";
test("sample", () => {
const x = 1;
expect(x).toBe(1);
});
EOF
pnpx jest
npx tsc --noEmit index.test.ts
```
## 原因
`@jest/globals`を明示的にインストールしていないため、[[pnpm]]だと`node_modules`配下に`@jest/globals`が追加されないから。
[[npm]]の場合は依存関係が依存しているパッケージもすべて`node_modules`配下にフラットに展開されるため、`@jest/globals`が依存関係に存在する。なお、依存関係は以下の通りであり、`jest-runtime`の依存関係となっている。
```
jest 29.7.0
├─┬ @jest/core 29.7.0
│ ├─┬ jest-config 29.7.0
│ │ ├─┬ jest-circus 29.7.0
│ │ │ └─┬ jest-runtime 29.7.0
│ │ │ └── @jest/globals 29.7.0
```
> [!note]
> [[npm]]では`@jest/globals`のインストールを忘れてしまっても動いてもしまうため、気づきにくい状態になっている...。
## 解決方法
`@jest/globals`を明示的にインストールする。
```console
pnpm add -D @jest/globals
```
公式サイトでも明示的なインストールをするように案内されている。
<div class="link-card">
<div class="link-card-header">
<img src="https://jestjs.io/ja/img/jest.png" class="link-card-site-icon"/>
<span class="link-card-site-name">jestjs.io</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">はじめましょう · Jest</p>
<p class="link-card-description">お気に入りのパッケージマネージャーを使用して Jest をインストールします。</p>
</div>
<img src="https://jestjs.io/ja/img/opengraph.png" class="link-card-image" />
</div>
<a href="https://jestjs.io/ja/docs/getting-started#type-definitions"></a>
</div>