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 typecheck
Vitest, 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.