Tests de Typage
Vitest vous permet d'écrire des tests pour vos types en utilisant les syntaxes expectTypeOf
et assertType
. Par défaut, tous les fichiers *.test-d.ts
sont considérés comme des tests de type, mais vous pouvez modifier ce comportement avec l'option de configuration typecheck.include
.
En arrière-plan, Vitest appelle tsc
ou vue-tsc
, selon votre configuration, et analyse les résultats. Vitest affiche également les erreurs de type dans votre code source, le cas échéant. Vous pouvez désactiver cet affichage avec l'option de configuration typecheck.ignoreSourceErrors
.
Notez que Vitest n'exécute ni ne compile ces fichiers. Ils sont uniquement analysés statiquement par le compilateur. Par conséquent, vous ne pouvez pas utiliser d'instructions dynamiques dans ces tests. Cela signifie que les noms de test dynamiques, les APIs test.each
, test.runIf
, test.skipIf
et test.concurrent
ne sont pas supportés. Vous pouvez cependant utiliser d'autres APIs, comme test
, describe
, .only
, .skip
et .todo
.
L'utilisation des flags CLI, comme --allowOnly
et -t
, est également prise en charge pour la vérification de type.
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 }));
});
Toute erreur de type détectée dans un fichier de test sera traitée comme un échec de test. Vous pouvez donc utiliser toutes les techniques de typage pour tester les types de votre projet.
Vous pouvez consulter la liste des matchers disponibles dans la section API.
Interprétation des Erreurs
Si vous utilisez l'API expectTypeOf
, vous pourriez rencontrer des erreurs difficiles à interpréter ou inattendues :
expectTypeOf(1).toEqualTypeOf<string>();
// ^^^^^^^^^^^^^^^^^^^^^^
// index-c3943160.d.ts(90, 20): Arguments for the rest parameter 'MISMATCH' were not provided.
Cela est dû à la manière dont expect-type
gère les erreurs de type.
Malheureusement, TypeScript ne fournit pas de métadonnées de type sans patch. Il n'est donc pas possible de fournir des messages d'erreur plus clairs pour le moment. Cependant, des travaux sont en cours dans le projet TypeScript pour améliorer cela. Si vous souhaitez des messages plus précis, n'hésitez pas à encourager l'équipe TypeScript à examiner cette PR.
Si vous trouvez l'API expectTypeOf
difficile à utiliser et à interpréter, vous pouvez toujours opter pour l'API assertType
, qui est plus simple :
const answer = 42;
assertType<number>(answer);
// @ts-expect-error answer is not a string
assertType<string>(answer);
TIP
Lorsque vous utilisez la syntaxe @ts-expect-error
, il est conseillé de vérifier que vous n'avez pas fait de faute de frappe. Vous pouvez le faire en incluant vos fichiers de type dans l'option de configuration test.include
, afin que Vitest exécute également ces tests et signale une erreur ReferenceError
.
Le test passera, car il est censé produire une erreur, mais le mot "answer" contient une faute de frappe, ce qui génère un faux positif :
// @ts-expect-error answer is not a string
assertType<string>(answr); //
Exécuter la vérification de type
Ajoutez cette commande à la section scripts
de votre fichier package.json
:
{
"scripts": {
"typecheck": "vitest typecheck"
}
}
Vous pouvez maintenant exécuter la vérification de type :
# npm
npm run typecheck
# yarn
yarn typecheck
# pnpm
pnpm run typecheck
Vitest utilise tsc --noEmit
ou vue-tsc --noEmit
, selon votre configuration. Vous pouvez donc supprimer ces scripts de votre chaîne de production.