ProgramlamaFrontend/Backend geliştirici

TypeScript'te Strict Function Types seçeneği nasıl çalışır ve yapılandırılmıştır? Fonksiyonların kovaryans ve kontravaryans tür kontrolüne etkisi nedir ve hangi durumlarda imza uyumsuzluğu derleme hatasına yol açar?

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

Cevap.

Soru Tarihi

Varsayılan olarak, TypeScript, işlev tür imzalarının eşleştirilmesinde belirli bir "esneklik" kabul eder; dönüşümlü ve dönüşümsüz işlevlerin uyumlu olarak değerlendirilmesine izin verir. TypeScript 2.6'dan itibaren, işlevlerin türlerinin sıkı bir şekilde kontrolünü sağlayan ve büyük kod tabanlarında birçok hata türünü önleyen strictFunctionTypes seçeneği ortaya çıktı.

Sorun

Sıkı kontrol olmadan, bir işlevin, beklenenden daha fazla veya daha spesifik türde parametreler alması durumu, geliştirici için fark edilmeden gerçekleşebilir. Bu, dönen türlerin kovaryansı ve argümanların kontravaryansı ile ilgili çalışma zamanı hatalarına neden olur.

Çözüm

strictFunctionTypes seçeneği, işlev parametrelerinin türleri için sıkı bir kontravaryans getirir. Artık işlevler, kaynak türün hedef türün süper türü olduğu sürece uyumlu hale gelir, tersi durumda değil.

Kod örneği:

type Animal = { name: string }; type Cat = { name: string; meow: () => void }; let animalHandler: (a: Animal) => void; let catHandler: (c: Cat) => void; animalHandler = catHandler; // strictFunctionTypes'da hata: argüman çok spesifik catHandler = animalHandler; // İzin verildi, Cat — Animal'ın alt türü

Anahtar özellikler:

  • İşlev argümanları, "süper türler" (kontravaryans) açısından uyumluluk için kontrol edilir
  • Dönüş değerleri, kovaryans açısından kontrol edilir (alt türler izinlidir)
  • İmza ihlalleri derleme hatalarına yol açar

İkna Edici Sorular.

Daha spesifik bir parametre türü olan bir işleyici daha önce atanabilir miydi, strictFunctionTypes aktif olmadan?

Evet, strictFunctionTypes devreye girmeden önce TypeScript, daha spesifik işlevlerin genel işlevlerin yerine atanmasına izin veriyordu; bu, çalışma zamanı sorunlarına yol açıyordu:

enum E { A, B } const f: (e: E) => void = (e: E.A) => {} // strictFunctionTypes olmadan: izinli

StrictFunctionTypes, opsiyonel parametreler içeren geri çağrıları nasıl etkiler?

Eğer geri çağırma işlevinin parametrelerinden bazıları opsiyonel hale getiriliyorsa, sıkı kontrol, daha az zorunlu parametreye sahip bir işlevin daha fazla zorunlu parametre bekleyen bir pozisyonda kullanılmasına izin vermez. Bu, geri çağırmanın gerekli verileri almadığı durumları önler.

StrictFunctionTypes'ın mevcut projelerdeki uyumluluk sorunları olacak mı?

Evet, yeni derleme hatalarının ortaya çıkma riski vardır, çünkü birçok işlev ve işleyici, kontravaryans ihlal edilerek birbirine atanmış olabilir. Bu genellikle geri çağırmalarda veya katı tiplenmemiş üçüncü parti API'lerin kullanımında karşılaşılır.

Tip Hataları ve Antipattern'lar

  • Opsiyonel parametreler için eski tiplerin kullanımı
  • Daha spesifik/dar bir parametre türüne sahip bir işlevin genel bir işleyiciye atanması denemesi
  • StrictFunctionTypes'ı etkinleştirirken hataların göz ardı edilmesi (tipleri düzeltmek yerine seçeneği devre dışı bırakmak)

Gerçek Hayattan Örnekler

Olumsuz Durum

Büyük bir projede, olay işleyicileri daha spesifik türleri (genel Event yerine MouseEvent) almaktadır. Bu, sıkı seçeneğin etkinleştirilmesiyle, farklı olay kaynaklarıyla çalıştırıldığında hatalara yol açmasına neden olmadan fark edilmez.

Artılar:

  • Daha hızlı prototipleme

Eksiler:

  • Olay türlerinin uyuşmazlığı durumunda çalışma zamanı hataları
  • Kod genişletildiğinde karmaşık hata ayıklama

Olumlu Durum

Projenin en başından itibaren strictFunctionTypes kullanılıyor. Yeni işleyiciler eklendiğinde, türler arasındaki tüm uyumsuzluklar derleyici tarafından otomatik olarak keşfedilir. Kod, yazım hatalarına karşı daha dayanıklı hale gelir ve daha kolay sürdürülür.

Artılar:

  • Güvenilirlik
  • İşlevlerin ve işleyicilerin güvenli aktarımları
  • Yeniden yapılandırma sırasında öngörülebilir davranış

Eksiler:

  • İmza tasarımında titiz olmayı gerektirir
  • Bazı durumlarda uyumluluk için ek sarmalayıcılar veya aşırı yükleme yazmak gerekebilir