Testando Tipos de Dados
O Vitest permite que você escreva testes para seus tipos, usando as sintaxes expectTypeOf
ou assertType
. Por padrão, todos os testes dentro de arquivos *.test-d.ts
são considerados testes de tipo, mas você pode alterar isso com a opção de configuração typecheck.include
.
Internamente, o Vitest chama tsc
ou vue-tsc
, dependendo da sua configuração, e processa os resultados. O Vitest também reportará erros de tipo no seu código-fonte, caso encontre algum. Você pode desativar essa funcionalidade com a opção de configuração typecheck.ignoreSourceErrors
.
É importante notar que o Vitest não executa ou compila esses arquivos; eles são apenas analisados estaticamente pelo compilador. Portanto, você não pode usar nenhuma declaração dinâmica. Isso significa que você não pode usar nomes dinâmicos para testes e APIs como test.each
, test.runIf
, test.skipIf
e test.concurrent
. No entanto, você pode usar outras APIs, como test
, describe
, .only
, .skip
e .todo
.
O uso de opções da CLI, como --allowOnly
e -t
, também é suportado para a verificação de tipo.
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 }));
});
Qualquer erro de tipo detectado dentro de um arquivo de teste será tratado como um erro de teste. Isso permite que você use qualquer técnica de tipagem que desejar para testar os tipos do seu projeto.
Você pode encontrar uma lista de matchers disponíveis na seção API.
Interpretando Erros
Se você estiver usando a API expectTypeOf
, pode encontrar erros difíceis de interpretar ou que parecem inesperados:
expectTypeOf(1).toEqualTypeOf<string>();
// ^^^^^^^^^^^^^^^^^^^^^^
// index-c3943160.d.ts(90, 20): Arguments for the rest parameter 'MISMATCH' were not provided.
Isso ocorre devido à forma como a biblioteca expect-type
lida com erros de tipo.
Infelizmente, o TypeScript não fornece metadados de tipo sem correções, então não podemos fornecer mensagens de erro mais claras no momento. No entanto, há desenvolvimento em andamento no projeto TypeScript para corrigir isso. Se você deseja mensagens melhores, incentive a equipe do TypeScript a analisar o PR mencionado.
Se você achar difícil trabalhar com a API expectTypeOf
e identificar erros, você sempre pode usar a API assertType
, que é mais simples:
const answer = 42;
assertType<number>(answer);
// @ts-expect-error answer is not a string
assertType<string>(answer);
TIP
Ao usar a sintaxe @ts-expect-error
, é recomendável que você se certifique de que não cometeu um erro de digitação. Você pode fazer isso incluindo seus arquivos de tipo na opção de configuração test.include
, para que o Vitest também execute esses testes e falhe com ReferenceError
.
Este teste passará, pois espera-se um erro, mas a palavra "answer" tem um erro de digitação, então é um falso positivo:
// @ts-expect-error answer is not a string
assertType<string>(answr); //
Executando a verificação de tipos
Adicione este comando à sua seção scripts
em package.json
:
{
"scripts": {
"typecheck": "vitest typecheck"
}
}
Agora você pode executar o typecheck:
# npm
npm run typecheck
# yarn
yarn typecheck
# pnpm
pnpm run typecheck
O Vitest usa tsc --noEmit
ou vue-tsc --noEmit
, dependendo da sua configuração. Portanto, você pode remover esses scripts do seu pipeline.