Тестирование типов
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 typecheckVitest использует tsc --noEmit или vue-tsc --noEmit (в зависимости от вашей конфигурации), поэтому вы можете удалить соответствующие скрипты из вашего пайплайна.