TypeScript saçma bir istisna fırlatıyor


TypeScript bunun için bir hata verir:

const tryAddress = async (add?: string, postcode?: string) => {
  if (postcode?.length < 5) {
   // ^^^^^^^^^^^^^^^^ Object is possibly 'undefined'.

Ama bu değil:

const tryAddress = async (add?: string, postcode?: string) => {
  if (postcode && postcode.length < 5) {

?. kısayolunun, aşağıdaki gibi koşullar yazmamızı önlememizi sağlaması gerektiğini sanıyordum. Bir şeyi mi kaçırıyorum?

Düzenle :

Anladım! Çünkü bu basitleştiğinde

(undefined < 5)

Ama, bu koşulları yazmanın daha iyi bir yolu var mı? Çünkü ben onları sürekli yazıyorum!

Cevap #1

Bu tamamen mantıklı bir hata.

postcode?.length, undefined | number olarak değerlendirilir.

O birleşim tipinin undefined üyesi < ile uyumsuzdur.

postcode && postcode.length < 5 çalışır çünkü sağ taraf değerlendirildiğinde, postcode.length değerinin undefined olma olasılığı ortadan kalkmıştır, bu yüzden türü basitçe number'dır ve bu değer rahatlıkla karşılaştırılabilir.

Cevap #2

Hata biraz yanıltıcıdır. Bu, undefined kullanıldığında bir karşılaştırmada meydana gelir. Aşağıdakinin aynı sorunu vardır:

if (undefined < 5) {

Daha kesin bir hata mesajı şun olurdu:

Bu muhtemelen tanımsızdır ve bu nedenle mantıklı bir şekilde karşılaştırılamaz

Sonuçta, ne beklerdiniz ki

undefined < 5

neye eşdeğer olacağını değerlendirmek? Kodu okuyan herkes aynı sonuca mı varır? Mutlaka değil - bu nedenle TS bunu yasaklar.

Karşılaştırma yaparken isteğe bağlı zincirlemeyi kullanmayın, çünkü undefined bu bağlamda anlam taşımaz. Orijinaliniz:

if (postcode && postcode.length < 5) {

en net yaklaşım ve benim tercih edeceğim olan bu.