타입 테스트
Vitest를 사용하면 expectTypeOf
또는 assertType
구문을 사용하여 타입에 대한 테스트를 작성할 수 있습니다. 기본적으로 *.test-d.ts
파일 내의 모든 테스트는 타입 테스트로 간주되지만, typecheck.include
설정 옵션을 사용하여 이를 변경할 수 있습니다.
Vitest는 내부적으로 설정에 따라 tsc
또는 vue-tsc
를 호출하고 그 결과를 분석합니다. 소스 코드에서 타입 오류가 발견되면 Vitest는 이를 출력합니다. typecheck.ignoreSourceErrors
설정 옵션을 사용하여 이 기능을 비활성화할 수 있습니다.
이러한 파일은 실행되거나 컴파일되지 않고, 컴파일러에 의해 정적으로 분석될 뿐이므로 동적 문법을 사용할 수 없습니다. 즉, 동적 테스트 이름, 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 is a 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 프로젝트의 작업이 진행 중입니다. 더 나은 메시지를 원하시면 TypeScript 팀에 해당 PR에 대한 의견을 요청해 주십시오.
expectTypeOf
API를 사용하는 데 어려움을 겪는 경우 더 간단한 assertType
API를 사용할 수 있습니다.
const answer = 42;
assertType<number>(answer);
// @ts-expect-error answer is not a string
assertType<string>(answer);
TIP
@ts-expect-error
구문을 사용하는 경우 오타가 없는지 확인하는 것이 좋습니다. test.include
설정 옵션에 타입 파일을 포함하여 Vitest가 실제로 이러한 테스트를 실행하고 ReferenceError
로 실패하도록 할 수 있습니다.
다음 코드는 오류를 예상하기 때문에 통과하지만 "answer"라는 단어에 오타가 있어 거짓 양성 오류를 발생시킵니다.
// @ts-expect-error answer is not a 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
를 사용하므로 이러한 스크립트를 작업 흐름에서 제거할 수 있습니다.