Tür Testleri
Vitest, expectTypeOf veya assertType sözdizimlerini kullanarak türleriniz için testler yazmanızı sağlar. Varsayılan olarak *.test-d.ts dosyaları içindeki tüm testler tür testleri olarak kabul edilir, ancak bunu typecheck.include yapılandırma seçeneğiyle değiştirebilirsiniz.
Vitest, yapılandırmanıza bağlı olarak tsc veya vue-tsc'yi çağırır ve sonuçları işler. Vitest, hata bulursa kaynak kodunuzdaki tür hatalarını da yazdırır. Bunu devre dışı bırakmak için typecheck.ignoreSourceErrors yapılandırma seçeneğini kullanabilirsiniz.
Vitest'in bu dosyaları çalıştırmadığını veya derlemediğini unutmayın; bunlar yalnızca derleyici tarafından statik olarak analiz edilir ve bu nedenle dinamik ifadeler kullanamazsınız. Bu nedenle, dinamik test adları ve test.each, test.runIf, test.skipIf, test.concurrent API'lerini kullanamazsınız. Ancak test, describe, .only, .skip ve .todo gibi diğer API'leri kullanabilirsiniz.
--allowOnly ve -t gibi CLI bayrakları da tür kontrolü için desteklenmektedir.
import { assertType, expectTypeOf } from 'vitest';
import { mount } from './mount.js';
test('türlerimin doğru çalıştığını', () => {
expectTypeOf(mount).toBeFunction();
expectTypeOf(mount).parameter(0).toMatchTypeOf<{ name: string }>();
// @ts-expect-error name bir string olmalı
assertType(mount({ name: 42 }));
});Bir test dosyası içinde tetiklenen herhangi bir tür hatası, test hatası olarak kabul edilir. Bu nedenle, projenizin türlerini test etmek için istediğiniz tür manipülasyonunu kullanabilirsiniz.
API bölümünde olası eşleştiricilerin bir listesini görebilirsiniz.
Hataları Okuma
expectTypeOf API'sini kullanıyorsanız, okuması zor veya beklenmedik hatalar fark edebilirsiniz:
expectTypeOf(1).toEqualTypeOf<string>();
// ^^^^^^^^^^^^^^^^^^^^^^
// index-c3943160.d.ts(90, 20): Arguments for the rest parameter 'MISMATCH' were not provided.Bunun nedeni expect-type'ın tür hatalarını işleme şeklidir.
Ne yazık ki, TypeScript değişiklik yapılmadan tür meta verileri sağlamaz. Bu nedenle, şu anda yararlı hata mesajları sağlayamıyoruz. Ancak, bunu düzeltmek için TypeScript projesinde çalışmalar devam etmektedir. Daha iyi hata mesajları istiyorsanız, lütfen TypeScript ekibinden söz konusu PR'yi incelemelerini isteyin.
expectTypeOf API'siyle çalışmakta ve hataları anlamakta zorlanıyorsanız, her zaman daha basit olan assertType API'sini kullanabilirsiniz:
const answer = 42;
assertType<number>(answer);
// @ts-expect-error answer bir string değil
assertType<string>(answer);TIP
@ts-expect-error sözdizimini kullanırken, yazım hatası yapmadığınızdan emin olmak isteyebilirsiniz. Bunu, tür dosyalarınızı test.include yapılandırma seçeneğine dahil ederek yapabilirsiniz, böylece Vitest bu testleri gerçekten çalıştırır ve ReferenceError ile başarısız olur.
Bu, bir hata beklediği için bu test geçecektir, ancak "answer" kelimesinde bir yazım hatası var, bu yüzden hatalı bir pozitif sonuç verir:
// @ts-expect-error answer bir string değil
assertType<string>(answr); //Tür Kontrolünü Çalıştırma
package.json dosyanızdaki scripts bölümüne bu komutu ekleyin:
{
"scripts": {
"typecheck": "vitest typecheck"
}
}Şimdi tür kontrolünü başlatabilirsiniz:
# npm
npm run typecheck
# yarn
yarn typecheck
# pnpm
pnpm run typecheckVitest, yapılandırmanıza bağlı olarak tsc --noEmit veya vue-tsc --noEmit kullanır, bu nedenle bu komut dosyalarını işlem hattınızdan kaldırabilirsiniz.