ProgramlamaFrontend geliştirici

TypeScript'te tür koruma mekanizmasını (Type Guards) açıklayın ve kullanım örnekleri verin. En büyük avantajı nedir ve kullanıcı tanımlı type guard fonksiyonları uygulanırken hangi hususlara dikkat edilmelidir?

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

Cevap.

Type Guards, bir kod bloğunda bir değişkenin türünü belirli kontroller (örneğin, typeof, instanceof veya param is SomeType türünde ifadeler döndüren özel fonksiyonlar kullanarak) temelinde netleştiren mekanizmalardır.

En büyük avantajı - derleme zamanı tür kontrolü sayesinde güvenlik ve çalışma zamanı hatalarının önlenmesidir.

Örnek:

interface Fish { swim: () => void } interface Bird { fly: () => void } function isFish(pet: Fish | Bird): pet is Fish { return (pet as Fish).swim !== undefined; } function move(pet: Fish | Bird) { if (isFish(pet)) { pet.swim(); } else { pet.fly(); } }

Burada isFish fonksiyonu, kullanıcı tanımlı bir type guard'dır.

Hususlar:

  • Ek mantıksal kontroller, tür tanımlaması ile sıkı bir şekilde ilişkilendirilmelidir.
  • Type guard fonksiyonlarındaki hatalar, yürütme sırasında yanlış tür tanımlamalarına yol açabilir.

Soru tuzağı.

Soru: "TypeScript derleyicisi, guard fonksiyonunun döndürdüğü değere mı her zaman güveniyor, yoksa fonksiyonun içinde başka bir analiz mi yapıyor?"

Cevap: TypeScript derleyicisi, yalnızca param is Type döndürme değerinin imzasına güvenir. Guard fonksiyonu içinde olanlar, uygulanabilirliğin doğruluğu açısından analiz edilmez.

Örnek (tehlikeli hata!):

function isString(x: any): x is string { return true; } // Derleyici her zaman bunun bir string olduğunu düşünecektir, oysa durum böyle değildir: if (isString(123)) { // buradaki x türü string, ama aslında bu bir sayıdır }

Konuyla ilgili bilgi eksikliğinden kaynaklanan gerçek hata örnekleri.


Hikaye

Ön uç ve arka uç arasında paylaşılan DTO'lar olan bir projede, kullanıcı tanımlı type guard içinde sıkı bir kontrol eklemeyi unuttular. Sonuç olarak, bazı veriler yanlış bir şekilde gerekli türde algılanarak, eksik bir özelliği kullanmaya çalışırken istemcide hatalara yol açtı.


Hikaye

Bir geliştirici, isteğe bağlı bir alana dayanarak bir type guard yazdı, ancak veri yapısı bu alanı hiç bulundurmayabiliyordu. Sonuç olarak, tür switch-case'inde dal eksikti ve derleyici uyarı vermezdi - çalışma zamanında istisnalar oluşuyordu.


Hikaye

TypeScript'e geçerken, yalnızca yerleşik type guard'lara (typeof, instanceof) güvenen bir hizmette, nesnelerin prototipinin değiştirilmesi sırasında kontrol sonuçları geçersiz hale geldi ve bu da prod'da çözülmesi zor hatalara yol açtı.