Típusok tesztelése
A Vitest lehetővé teszi, hogy teszteket írj a típusaidhoz az expectTypeOf
vagy az assertType
szintaxis használatával. Alapértelmezés szerint a *.test-d.ts
fájlokban lévő összes teszt típus tesztnek minősül, de ezt megváltoztathatod a typecheck.include
konfigurációs opcióval.
A háttérben a Vitest a tsc
-t vagy a vue-tsc
-t hívja meg, a konfigurációdtól függően, és elemzi az eredményeket. A Vitest a forráskódban található típushibákat is kiírja, ha talál ilyet. Ezt letilthatod a typecheck.ignoreSourceErrors
konfigurációs opcióval.
Fontos megjegyezni, hogy a Vitest nem futtatja és nem is fordítja le ezeket a fájlokat, csak statikusan elemzi őket a fordító. Emiatt nem használhatsz dinamikus utasításokat, például dinamikus tesztneveket, illetve a test.each
, test.runIf
, test.skipIf
, test.concurrent
API-kat. Viszont használhatsz más API-kat, mint például a test
, describe
, .only
, .skip
és .todo
.
A CLI kapcsolók, mint például a --allowOnly
és a -t
, szintén támogatottak a típusellenőrzéshez.
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 }));
});
Bármely típushiba, amely egy tesztfájlon belül fordul elő, teszthibaként lesz kezelve, így bármilyen típus trükköt használhatsz a projekted típusainak tesztelésére.
A lehetséges összehasonlítók listáját az API szekcióban találod.
Hibák olvasása
Ha az expectTypeOf
API-t használod, nehezen olvasható vagy váratlan hibákba ütközhetsz:
expectTypeOf(1).toEqualTypeOf<string>();
// ^^^^^^^^^^^^^^^^^^^^^^
// index-c3943160.d.ts(90, 20): Arguments for the rest parameter 'MISMATCH' were not provided.
Ez azért van, mert az expect-type
könyvtár így kezeli a típushibákat.
Sajnos a TypeScript nem biztosít típusmetaadatokat javítás nélkül, ezért jelenleg nem tudunk hasznos hibaüzeneteket adni. Azonban a TypeScript projektben dolgoznak ennek javításán. Ha részletesebb hibaüzenetekre van szükséged, kérjük, vedd fel a kapcsolatot a TypeScript csapattal, hogy vessenek egy pillantást a említett PR-re.
Ha nehéznek találod az expectTypeOf
API-val való munkát és a hibák értelmezését, mindig használhatod az egyszerűbb assertType
API-t:
const answer = 42;
assertType<number>(answer);
// @ts-expect-error answer is not a string
assertType<string>(answer);
TIP
Amikor a @ts-expect-error
szintaxist használod, érdemes megbizonyosodni arról, hogy nem írtál el valamit. Ezt úgy teheted meg, hogy a típusfájljaidat beleveszed a test.include
konfigurációs opcióba, így a Vitest ténylegesen futtatja ezeket a teszteket, és ReferenceError
-t fog eredményezni.
Ez sikeres lesz, mert hibát vár, de a "answer" szó el van gépelve, így ez egy téves pozitív hiba:
// @ts-expect-error answer is not a string
assertType<string>(answr); //
Típusellenőrzés futtatása
Add hozzá ezt a parancsot a package.json
fájl scripts
szekciójához:
{
"scripts": {
"typecheck": "vitest typecheck"
}
}
Most futtathatod a típusellenőrzést:
# npm
npm run typecheck
# yarn
yarn typecheck
# pnpm
pnpm run typecheck
A Vitest a tsc --noEmit
vagy a vue-tsc --noEmit
parancsot használja, a konfigurációdtól függően, így eltávolíthatod ezeket a scripteket a pipeline-ból.