型テスト
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 typecheck
Vitest は、構成に応じて tsc --noEmit
または vue-tsc --noEmit
を使用するため、これらのスクリプトは CI/CD パイプラインから削除できます。