TypeScriptの型をテストする
#TypeScript
テスト方法
ライブラリを使ってテストする
型をテストする際はexpect-typeやtsdなどの専用のライブラリを使うと便利です
ただし、ライブラリを使わなくてもテストは可能なので、必要に応じて導入するとよいと思います
ライブラリを使わないでテストする
専用のライブラリを使用せずとも、関数の戻り値として返却された値を変数に格納する際に、該当の変数の型を明示することでテストすることなども可能です
code:typescript
test('findUser', () => {
const user: User = findUser(users, predicate);
expect(user.id).toBe(someID);
});
@ts-expect-errorを使う
ある型が意図せぬ使われ方をした際に、きちんとエラーが発生することを検証する際に使うと便利です
code:typescript
// @ts-expect-error string should not be assignable to UserID
const userID: UserID = "12345";
ライブラリ
expect-type
code:typescript
import { expectTypeOf } from 'expect-type';
expectTypeOf<User>().toMatchTypeOf<{ id: string }>();
Vitestでは最初からexpect-typeが組み込まれており、別途インストールが不要です
code:typescript
import { expectTypeOf, test } from 'vitest';
test('UpperCase', () => {
expectTypeOf<UpperCase<"foo">>().toMatchTypeOf<"FOO">();
});
tsd
専用のCLIを介してテストが実行されるのがexpect-typeなどのライブラリとは異なる点
deno_std/testing/types.ts
deno_stdで提供されているのでDenoを使う場合は選択肢の一つとしてよさそうです
いつ書くべきか?
基本的にユニットテストなどによって該当の型定義を持つ関数や型が間接的にカバーされているのであれば、書く必要性は低いと思います
専用のユーティリティタイプや複雑なオーバーロードが定義された関数を独自に実装した際などに書くとよさそうです
複数の関連する型の互換性を保証したい場合 (例: Zodなどで定義された型とOpenAPIやGraphQLスキーマから生成された型を比較したい場合、など)