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:
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.
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:
Eksiler:
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:
Eksiler: