Testování typů
Vitest umožňuje psát testy pro vaše typy pomocí syntaxí expectTypeOf nebo assertType. Ve výchozím nastavení jsou všechny soubory s příponou *.test-d.ts považovány za testy typů, ale toto chování můžete změnit pomocí konfigurační možnosti typecheck.include.
Vitest interně volá tsc nebo vue-tsc, v závislosti na vaší konfiguraci, a analyzuje výsledky. Vitest také zobrazí typové chyby ve vašem zdrojovém kódu, pokud je nalezne. Tuto funkci můžete zakázat pomocí konfigurační možnosti typecheck.ignoreSourceErrors.
Upozorňujeme, že Vitest tyto soubory nespouští ani nekompiluje; jsou pouze staticky analyzovány kompilátorem. Proto nemůžete používat dynamické výrazy, jako jsou dynamické názvy testů, API test.each, API test.runIf, API test.skipIf a API test.concurrent. Můžete však používat jiná API, jako test, describe, .only, .skip a .todo.
Použití přepínačů CLI, jako --allowOnly a -t, je pro kontrolu typů také podporováno.
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 }));
});Jakákoli typová chyba detekovaná v testovacím souboru bude považována za chybu testu. Můžete tedy použít libovolné typové triky k testování typů vašeho projektu.
Seznam dostupných porovnávačů naleznete v sekci API.
Čtení Chyb
Při používání API expectTypeOf se můžete setkat s obtížně čitelnými nebo neočekávanými chybami:
expectTypeOf(1).toEqualTypeOf<string>();
// ^^^^^^^^^^^^^^^^^^^^^^
// index-c3943160.d.ts(90, 20): Arguments for the rest parameter 'MISMATCH' were not provided.Je to způsobeno způsobem, jakým knihovna expect-type zpracovává typové chyby.
TypeScript bohužel neposkytuje metadata typů bez úprav, takže v současné době nemůžeme poskytnout užitečné chybové zprávy. Nicméně, existují probíhající práce na projektu TypeScript, které by to měly vyřešit. Pokud požadujete lepší chybové zprávy, obraťte se na tým TypeScript a požádejte je o kontrolu zmíněného PR.
Pokud vám práce s API expectTypeOf způsobuje potíže a obtížně se vám zjišťují chyby, můžete vždy použít jednodušší API assertType:
const answer = 42;
assertType<number>(answer);
// @ts-expect-error answer is not a string
assertType<string>(answer);TIP
Při použití syntaxe @ts-expect-error se ujistěte, že jste neudělali překlep. Můžete to ověřit zahrnutím souborů typů do konfigurační možnosti test.include, aby Vitest tyto testy skutečně spustil a selhal s ReferenceError, pokud se překlep vyskytne.
Tento test projde, protože očekává chybu, ale slovo „answer“ má překlep, takže výsledek je falešně pozitivní:
// @ts-expect-error answer is not a string
assertType<string>(answr); //Provádění kontroly typů
Přidejte tento příkaz do sekce scripts ve vašem souboru package.json:
{
"scripts": {
"typecheck": "vitest typecheck"
}
}Nyní můžete spustit kontrolu typů:
# npm
npm run typecheck
# yarn
yarn typecheck
# pnpm
pnpm run typecheckVitest používá tsc --noEmit nebo vue-tsc --noEmit, v závislosti na vaší konfiguraci. Díky tomu můžete tyto skripty odebrat z vašeho CI/CD pipeline.