Vitestで型のtest
コマンドで検査する
code:package.json
"scripts": {
"test": "vitest --typecheck"
},
型だけ見てるっぽくて通常のテストコードの間違いは無視されるっぽいmrsekut.icon
というか、型のエラーも無視されている...なぜ?
必要であればtypecheckの設定も書く ref 例えば、libraryを作っている場合は、tsconfigでは**.test.tsをexcludeするが、test時は見て欲しい
code:vitest.config.ts
export default defineConfig({
test: {
typecheck: {
},
},
});
以下のいずれもtestできる
(値SUT|型Sut)が、(Expect値の型Expected型)と一致する
code:ts
expectTypeOf({ a: 1 }).toEqualTypeOf<{ a: number }>()
expectTypeOf({ a: 1 }).toEqualTypeOf({ a: 1 })
expectTypeOf<{ a: number}>().toEqualTypeOf<{ a: number }>()
expectTypeOf<{ a: number}>().toEqualTypeOf({ a: 1 })
not
toEqualTypeOf
toMatchTypeOf
extract, exclude
union typeのテストに便利
関数周り
returns
関数の返り値の型の検査
役割がassertTypeと被っているような気がする(?)mrsekut.icon
code:ts
const id = <T>(x: T) => x;
expectTypeOf(() => id(1)).returns.toEqualTypeOf<1>(); // 引数が1の時、返り値の型は「1」になる (numberではなく)
parameters
関数の引数の型の検査
parameter
関数の引数の型を個別に検査
その関数に対しこの引数が呼べるかを検査
constructorParameters
instance
items
resolves
guards
asserts
toBeAny
toBeUnknown
toBeNever
toBeFunction
toBeObject
toBeArray
toBeString
toBeBoolean
toBeVoid
toBeSymbol
toBeNull
toBeUndefined
toBeNullable
toBeConstructibleWith
toHaveProperty
code:ts
test('my types work properly', () => {
expectTypeOf(mount).toBeFunction()
expectTypeOf(mount).parameter(0).toMatchTypeOf<{ name: string }>()
// @ts-expect-error name is a string
assertType(mount({ name: 42 }))
})