Testowanie Typów
Vitest umożliwia pisanie testów typów za pomocą składni expectTypeOf lub assertType. Domyślnie, wszystkie pliki z rozszerzeniem *.test-d.ts są traktowane jako pliki testów typów, ale możesz to zmienić za pomocą opcji konfiguracyjnej typecheck.include.
Vitest w rzeczywistości wywołuje tsc lub vue-tsc (w zależności od konfiguracji) i analizuje wyniki. Wykryte błędy typów w kodzie źródłowym również zostaną wyświetlone przez Vitest. Możesz wyłączyć to zachowanie za pomocą opcji konfiguracyjnej typecheck.ignoreSourceErrors.
Pamiętaj, że Vitest nie uruchamia ani nie kompiluje tych plików – są one jedynie analizowane statycznie przez kompilator. Z tego powodu nie można używać dynamicznych nazw testów ani API test.each, test.runIf, test.skipIf, test.concurrent. Możesz jednak korzystać z innych API, takich jak test, describe, .only, .skip i .todo.
Flagi CLI, takie jak --allowOnly i -t, są również obsługiwane podczas sprawdzania typów.
import { assertType, expectTypeOf } from 'vitest';
import { mount } from './mount.js';
test('moje typy działają poprawnie', () => {
expectTypeOf(mount).toBeFunction();
expectTypeOf(mount).parameter(0).toMatchTypeOf<{ name: string }>();
// @ts-expect-error name jest typu string
assertType(mount({ name: 42 }));
});Każdy błąd typu występujący w pliku testowym będzie traktowany jako błąd testu, co pozwala na wykorzystanie zaawansowanych technik typowania do testowania typów w projekcie.
Listę dostępnych matcherów znajdziesz w sekcji API.
Interpretacja Błędów
Używając API expectTypeOf, możesz napotkać trudne do odczytania lub nieoczekiwane komunikaty o błędach:
expectTypeOf(1).toEqualTypeOf<string>();
// ^^^^^^^^^^^^^^^^^^^^^^
// index-c3943160.d.ts(90, 20): Arguments for the rest parameter 'MISMATCH' were not provided.Jest to związane ze sposobem, w jaki biblioteka expect-type obsługuje błędy typów.
Niestety, TypeScript nie udostępnia metadanych typów bez modyfikacji kompilatora, co uniemożliwia dostarczanie bardziej użytecznych komunikatów o błędach na tym etapie. Trwają jednak prace w projekcie TypeScript, mające na celu poprawę tej sytuacji. Jeśli zależy Ci na lepszych komunikatach, zachęcamy do wsparcia tego PR w zespole TypeScript.
Jeśli praca z API expectTypeOf i interpretacja błędów sprawiają trudności, zawsze możesz użyć prostszego API assertType:
const answer = 42;
assertType<number>(answer);
// @ts-expect-error answer nie jest typu string
assertType<string>(answer);TIP
Używając składni @ts-expect-error, warto upewnić się, że nie popełniłeś literówki. Możesz to zrobić, dodając pliki typów do opcji konfiguracyjnej test.include, co spowoduje, że Vitest uruchomi te testy i zakończy się niepowodzeniem z powodu ReferenceError.
Test przejdzie, ponieważ oczekiwano błędu, ale słowo "answer" zawiera literówkę, co prowadzi do fałszywie pozytywnego wyniku:
// @ts-expect-error answer nie jest typu string
assertType<string>(answr); //Uruchamianie Sprawdzania Typów
Dodaj następujące polecenie do sekcji scripts w pliku package.json:
{
"scripts": {
"typecheck": "vitest typecheck"
}
}Teraz możesz uruchomić sprawdzanie typów:
# npm
npm run typecheck
# yarn
yarn typecheck
# pnpm
pnpm run typecheckVitest używa tsc --noEmit lub vue-tsc --noEmit (w zależności od konfiguracji), więc możesz usunąć te skrypty z potoku CI/CD.