🧪
Jest mockResolvedValueの型エラーを1分で解決
概要
個人開発中に該当のエラーに遭遇し、AIに尋ねたのですが回りくどい解決策を提案されてしまい、「初めから公式を参照した方が早かったな」という体験をしたため、記事として投稿することにしました。
問題
Jest + TypeScriptの組み合わせでmockResolvedValueを使うときに、下記のような型エラーに遭遇することがあります:
// ❌ 型エラー
const mockFn = jest.fn().mockResolvedValue({ id: 'test' });
// Error: 型 'object' の引数を型 'never' のパラメーターに割り当てることはできません
原因
このエラーの原因は、jest.fn()を型情報なしで呼び出すことです。TypeScriptが戻り値の型を推論できないため、mockResolvedValueの引数がnever型になってしまいます。
jest.fn() // → 型が不明
.mockResolvedValue() // → 引数がnever型になる
解決方法
jest.fnに型引数を明示的に指定することで解決できます。
// ✅ 解決
import { jest } from '@jest/globals';
const mockFn = jest.fn<() => Promise<{ id: string }>>()
.mockResolvedValue({ id: 'test' });
実際の使用例
実際のテストコードで見てみましょう。
Before: 型エラーが発生
jest.mock('./service', () => ({
Service: jest.fn().mockImplementation(() => ({
getData: jest.fn().mockResolvedValue({ result: 'success' })
}))
}));
After: 型安全
interface Result {
result: string;
}
const mockGetData = jest.fn<() => Promise<Result>>()
.mockResolvedValue({ result: 'success' });
jest.mock('./service', () => ({
Service: jest.fn().mockImplementation(() => ({
getData: mockGetData
}))
}));
さまざまなパターン
引数がある関数の場合
// 引数がある関数の型定義
const mockFnWithArgs = jest.fn<(id: string) => Promise<{ name: string }>>()
.mockResolvedValue({ name: 'test user' });
複数の引数がある場合
const mockComplexFn = jest.fn<(id: string, options: { limit: number }) => Promise<Item[]>>()
.mockResolvedValue([{ id: '1', name: 'item1' }]);
ポイント
jest.fn<関数の型>()で型を明示- 引数がある場合:
jest.fn<(arg: string) => Promise<Result>>()
まとめ
Jest + TypeScriptでmockResolvedValueの型エラーが出たら、jest.fnに型引数を明示的に指定するだけで解決できます。この方法により、型安全性を保ちながらテストコードを書くことができます。
Discussion