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