📌

ZodやValibotで書いたスキーマの型のテストを書く(Vitestで)

に公開

ZodValibotは、unknownなデータを検証した上でTypeScriptの型をつけてくれる便利なライブラリですが、複雑なスキーマを書いてるとそのスキーマからどういう型になるのかテストを書きたくなりませんか? 私はなります。

例えば次のようなValibotのスキーマを書くと、InferInputでそのスキーマの型をとり出す事ができます。

import * as v from 'valibot';

const schema = v.object({
  name: v.string(),
});

// スキーマから { name: string } という型を取り出せる
type Schema = v.InferInput<typeof schema>;

こういう単純なスキーマであれば型のテストを書く必要はないのですが、実際にある程度複雑なスキーマを書いているときには、スキーマからどういう型をとり出せているのかテストを書きたくなる瞬間が来ます。

TypeScriptの型のテストを書く方法はいくつかありますが、ここではVitestを使って型のテストを書く方法を紹介します。

Vitestの通常のテストであれば .test.ts.spec.ts という拡張子のファイルを作りますが、型のテストを書く場合は .test-d.ts という拡張子を使います。

// foobar.test-d.ts
import { describe, test, expectTypeOf } from 'vitest';
import type { Schema } from './foobar.ts';

describe('Schema', () => {
  test("スキーマの型", () => {
    expectTypeOf<Schema>().toEqualTypeOf<{ name: string }>();
  });
});

Vitestでのアサーションでは通常は expect() を使いますが、型のテストでは expectTypeOf() を使います。

型のテストを実行するには、vitestの実行時にtypecheckオプションを付けてください。

$ vitest --typecheck

Vitestを使った型のテストの書き方については、詳しくはVitestのドキュメントや他の方が書いた記事もたくさんあるのでそれらを参考にしてみてください。

そんじゃーね!

RelayHub

Discussion