Test dei tipi
Vitest ti permette di scrivere test per i tuoi tipi, usando le sintassi expectTypeOf
o assertType
. Per impostazione predefinita, tutti i test all'interno dei file *.test-d.ts
sono considerati test dei tipi, ma puoi modificarlo tramite l'opzione di configurazione typecheck.include
.
Internamente, Vitest, a seconda della configurazione, invoca tsc
o vue-tsc
e ne analizza i risultati. Vitest segnalerà anche gli errori di tipo nel tuo codice sorgente, se presenti. Puoi disabilitare questa funzionalità con l'opzione di configurazione typecheck.ignoreSourceErrors
.
È importante notare che Vitest non esegue o compila questi file; vengono solo analizzati staticamente dal compilatore. Pertanto, non è possibile utilizzare istruzioni dinamiche. Nello specifico, non sono supportati nomi di test dinamici, né le API test.each
, test.runIf
, test.skipIf
e test.concurrent
. Puoi comunque utilizzare altre API, come test
, describe
, .only
, .skip
e .todo
.
È supportato anche l'utilizzo dei flag CLI, come --allowOnly
e -t
, per il controllo dei tipi.
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 }));
});
Qualsiasi errore di tipo generato all'interno di un file di test verrà trattato come un errore di test. Di conseguenza, puoi utilizzare qualsiasi tecnica di tipizzazione per testare i tipi del tuo progetto.
Puoi consultare un elenco dei possibili matcher nella sezione API.
Interpretazione degli errori
Se utilizzi l'API expectTypeOf
, potresti riscontrare errori di difficile interpretazione o inattesi:
expectTypeOf(1).toEqualTypeOf<string>();
// ^^^^^^^^^^^^^^^^^^^^^^
// index-c3943160.d.ts(90, 20): Arguments for the rest parameter 'MISMATCH' were not provided.
Questo comportamento è dovuto al modo in cui expect-type
gestisce gli errori di tipo.
Purtroppo, TypeScript non fornisce metadati di tipo senza modifiche, quindi non possiamo fornire messaggi di errore significativi al momento. Tuttavia, sono in corso attività nel progetto TypeScript per risolvere questo problema. Se desideri messaggi più chiari, ti invitiamo a sollecitare il team di TypeScript a valutare la PR menzionata.
Se hai difficoltà a utilizzare l'API expectTypeOf
e a interpretare gli errori, puoi sempre utilizzare l'API assertType
, che è più semplice:
const answer = 42;
assertType<number>(answer);
// @ts-expect-error answer is not a string
assertType<string>(answer);
TIP
Quando si utilizza la sintassi @ts-expect-error
, è consigliabile assicurarsi di non aver commesso errori di battitura. Puoi farlo includendo i tuoi file di tipo nell'opzione di configurazione test.include
, in modo che Vitest esegua questi test e fallisca con ReferenceError
.
Questo esempio avrà successo, poiché è previsto un errore, ma la parola "answer" contiene un errore di battitura, quindi si tratta di un falso positivo:
// @ts-expect-error answer is not a string
assertType<string>(answr); //
Esecuzione del controllo dei tipi
Aggiungi questo comando alla sezione scripts
del tuo package.json
:
{
"scripts": {
"typecheck": "vitest typecheck"
}
}
Ora puoi eseguire il controllo dei tipi:
# npm
npm run typecheck
# yarn
yarn typecheck
# pnpm
pnpm run typecheck
Vitest utilizza tsc --noEmit
o vue-tsc --noEmit
, a seconda della tua configurazione. Di conseguenza, puoi rimuovere questi script dal tuo processo di build.