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 typecheck
Vitest 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.