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.
