ProgramlamaTypeScript mimarı

TypeScript'te ayrımcı birleşimler (discriminated unions) aracılığıyla desen eşleştirme (pattern matching) nasıl gerçekleştirilir? Türler nasıl yapılandırılmalı ve hangi tuzaklar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

TypeScript'te desen eşleştirme, "ayrımcı birleşimler" (discriminated unions) aracılığıyla gerçekleştirilir. Bir birleşim içindeki her nesneye zorunlu bir ayrımcı alan (genellikle bir dize, örneğin type) atanır; bu alana göre TypeScript seçenekleri ayırt eder.

Örnek:

type Success = { type: 'success'; data: string }; type Failure = { type: 'failure'; error: string }; type Result = Success | Failure; function handleResult(result: Result) { switch (result.type) { case 'success': // result: Success console.log(result.data); break; case 'failure': // result: Failure console.error(result.error); break; } }

Switch/case veya if ile ayrımcı alana göre TypeScript, türü kesinlikle gerekli seçeneğe "daraltır".

Ana faydaları:

  • Katı tip kontrolü — mevcut olmayan bir alana erişim yapılamaz.
  • Yakalanabilirlik kontrolü — tüm seçenekler işlenmezse, bazen hata tetiklenir (açıkça zorlamak mümkündür).

Tuzaklı soru

Eğer ayrımcı birleşime yeni bir seçenek eklenirse, TypeScript tüm switch-case'leri güncellemeye zorlayacak mı, böylece yeni seçeneği işleyebileceğiz mi?

Cevap: Hayır, sadece "imkansız" seçeneği için açıkça işleme eklenirse. Örneğin, never fonksiyonu kullanarak:

Örnek:

function assertNever(x: never): never { throw new Error('Beklenmeyen seçenek: ' + x); } function handle(r: Result) { switch(r.type) { case 'success': /* ... */; break; case 'failure': /* ... */; break; default: return assertNever(r); // TS yeni bir tür geldiyse hata verir } }

Gerçek hatalara dair örnekler.


Hikaye

"Result" türünü yeni bir seçenek ('pending') ile genişlettikten sonra, uygulamanın çeşitli yerlerinde eski switch-case'ler bu durumu işlemediği için bazı arayüzler çalışmaz hale geldi. Hata, yayınlandıktan bir hafta sonra yalnızca üretimde fark edildi.


Hikaye

Benzersiz bir ayrımcı olmadan (type alanı iki türde de tekrar edildi) ayrımcı birleşim kullanmaya çalışmak, tiplerin "bulanıklaşmasına" yol açtı: TypeScript, türü kesin bir şekilde daraltmayı durdurdu ve mevcut olmayan alanlara erişim hatası olmadan mümkün hale geldi. Birkaç kritik hata üretime gitti.


Hikaye

Proje içinde desen eşleştirme, tek bir belirgin ayrımcı yerine birkaç alana göre if-else kullanılarak gerçekleştirildi. Bu durum, never fonksiyonu ile yakalanabilirlik kontrolüne geçişi zorlaştırdı ve kodun okunabilirliğini karmaşıklaştırdı — switch-case'ler yanlış çalıştı ve yeni seçenekler mevcut mantığı "bozdu".