型テスト
Vitest では、expectTypeOf または assertType 構文を使用して型テストを記述できます。デフォルトでは、*.test-d.ts ファイル内のすべてのテストが型テストとみなされますが、これは typecheck.include 設定オプションで変更できます。
内部的には、Vitest は設定に応じて tsc または vue-tsc を実行し、その結果を解析します。ソースコード内に型エラーが見つかった場合、Vitest はそれらを出力します。この動作は、typecheck.ignoreSourceErrors 設定オプションで無効にできます。
Vitest はこれらのファイルを実行またはコンパイルしないことに注意してください。これらはコンパイラによって静的に分析されるため、動的な記述は使用できません。つまり、動的なテスト名、test.each、test.runIf、test.skipIf、test.concurrent API は使用できません。ただし、test、describe、.only、.skip、.todo などの他の API は使用できます。
--allowOnly や -t などの CLI フラグも、型チェックでサポートされています。
import { assertType, expectTypeOf } from 'vitest';
import { mount } from './mount.js';
test('my types work properly', () => {
expectTypeOf(mount).toBeFunction();
expectTypeOf(mount).parameter(0).toMatchTypeOf<{ name: string }>();
// @ts-expect-error name は string 型であるべき
assertType(mount({ name: 42 }));
});テストファイル内でトリガーされた型エラーは、テストエラーとして扱われるため、プロジェクトの型をテストするために必要なあらゆる型のテクニックを使用できます。
使用可能なマッチャーの一覧は、API セクションを参照してください。
エラーの解釈
expectTypeOf API を使用している場合、読みにくいエラーや意図しないエラーが発生することがあります。
expectTypeOf(1).toEqualTypeOf<string>();
// ^^^^^^^^^^^^^^^^^^^^^^
// index-c3943160.d.ts(90, 20): Arguments for the rest parameter 'MISMATCH' were not provided.これは、expect-type が型エラーを処理する方法に起因します。
残念ながら、TypeScript はパッチを適用しないと型メタデータを提供できず、現時点では有用なエラーメッセージを提供できません。しかし、この問題を修正するための取り組みが進められています。より詳細なエラーメッセージが必要な場合は、TypeScript チームによる上記の PR を確認してください。
expectTypeOf API の操作やエラーの理解が難しい場合は、よりシンプルな assertType API を使用することも検討してください。
const answer = 42;
assertType<number>(answer);
// @ts-expect-error answer は string 型ではない
assertType<string>(answer);TIP
@ts-expect-error 構文を使用する場合、タイプミスがないか確認することを推奨します。これを確認するには、test.include 設定オプションに型ファイルを含めます。これにより、Vitest は実際にこれらのテストを 実行 し、ReferenceError で失敗させることができます。
これはエラーを予期しているため合格しますが、「answer」という単語にタイプミスがあるため、誤検出エラーとなります。
// @ts-expect-error answer は string 型ではない
assertType<string>(answr); //型チェックの実行
package.json の scripts セクションに次のコマンドを追加します。
{
"scripts": {
"typecheck": "vitest typecheck"
}
}これで型チェックを実行できます。
# npm
npm run typecheck
# yarn
yarn typecheck
# pnpm
pnpm run typecheckVitest は、構成に応じて tsc --noEmit または vue-tsc --noEmit を使用するため、これらのスクリプトは CI/CD パイプラインから削除できます。