expect-type
expect-typeは、TypeScriptの型定義が意図通りに機能しているかを確認するためのライブラリ
Jestなどとは異なり、コンパイル時に型の整合性をテストする メリット
型定義の信頼性向上
リファクタリング時の安全性向上
型定義を変更した際に、意図しない型変更によるエラーに早期に気づける
基本的な使い方
code:index.ts
// テスト対象の型や関数
type User = {
id: number;
name: string;
isAdmin: boolean;
};
function getUserName(user: User): string {
return user.name;
}
code:index.test.ts
import { expectTypeOf } from 'expect-type';
// User型が期待通りの構造かテスト
expectTypeOf<User>().toEqualTypeOf<{
id: number;
name: string;
isAdmin: boolean;
}>();
// User型に特定のプロパティが存在するかテスト
expectTypeOf<User>().toHaveProperty('id');
// プロパティの型もテスト
expectTypeOf<User>().toHaveProperty('name').toBeString();
expectTypeOf<User>().toHaveProperty('isAdmin').toBeBoolean();
// 関数の返り値の型をテスト
expectTypeOf(getUserName).returns.toBeString();
// 特定の型に代入可能かテスト
expectTypeOf<{ id: number; name: string; isAdmin: boolean; age?: number }>()
.toBeAssignableTo<User>(); // これはエラーになる(ageが余分なため User に代入できない)
expectTypeOf<User>()
.toBeAssignableTo<{ name: string }>(); // User型は { name: string } に代入可能
// より具体的な例:オプションプロパティ
type MaybeUser = {
id: number;
name?: string; // nameはオプショナル
}
expectTypeOf<MaybeUser>().toHaveProperty('name').toBeNullable(); // undefined許容のチェック
expectTypeOf<MaybeUser>().toHaveProperty('name').toEqualTypeOf<string | undefined>();