Тестирование типов
Vitest позволяет писать тесты для ваших типов, используя синтаксис expectTypeOf
или assertType
. По умолчанию все файлы *.test-d.ts
считаются файлами с тестами типов, но это можно изменить с помощью опции конфигурации typecheck.include
.
Vitest использует tsc
или vue-tsc
(в зависимости от вашей конфигурации) для анализа результатов. Vitest также отображает ошибки типов, обнаруженные в вашем исходном коде. Это можно отключить с помощью опции конфигурации typecheck.ignoreSourceErrors
.
Важно помнить, что Vitest не запускает и не компилирует эти файлы. Они анализируются компилятором статически, поэтому использование динамических операторов невозможно. Это означает, что динамические имена тестов и API test.each
, test.runIf
, test.skipIf
, test.concurrent
недоступны. Однако, вы можете использовать другие API, такие как test
, describe
, .only
, .skip
и .todo
.
Поддерживается использование флагов CLI, таких как --allowOnly
и -t
, для проверки типов.
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.
Чтение ошибок
При использовании API expectTypeOf
могут возникать трудночитаемые или неожиданные ошибки:
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.
Если вам сложно работать с API expectTypeOf
и разбираться в ошибках, вы всегда можете использовать более простой API assertType
:
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); //
Запуск проверки типов
Добавьте следующую команду в раздел scripts
в package.json
:
{
"scripts": {
"typecheck": "vitest typecheck"
}
}
Теперь вы можете запустить проверку типов:
# npm
npm run typecheck
# yarn
yarn typecheck
# pnpm
pnpm run typecheck
Vitest использует tsc --noEmit
или vue-tsc --noEmit
(в зависимости от вашей конфигурации), поэтому вы можете удалить соответствующие скрипты из вашего пайплайна.