ProgramlamaFullstack geliştirici

TypeScript'teki strictBindCallApply parametresi nasıl çalışır ve bind/call/apply yöntemlerinin tip güvenliğini ne şekilde değiştirir? Tüm ince detayları ve gerçek riskleri açıklayın.

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

Cevap.

Soru Tarihi:

JavaScript, bağlamı (this) ve argümanları geçirmek için bind, call ve apply yöntemlerini kullanmaya izin verir. TypeScript 3.2'den önce bu yöntemler daha az katı olarak kabul ediliyordu: argümanlarında fazla veya yanlış değerlerin geçmesine genellikle izin veriliyordu, bu da çalışma zamanında hatalara yol açıyordu. TypeScript, bu yöntemlerin imzalarını daha sıkı bir şekilde kontrol eden strictBindCallApply parametresini gerçekleştirdi.

Sorun:

Katı tip kontrolü olmadan bind/call/apply yöntemleri, fazla, eksik veya türü uyuşmayan argümanların geçmesine ve derleme aşamasında herhangi bir hata olmadan "kaçmasına" izin veriyordu.

Çözüm:

strictBindCallApply etkinleştirildiğinde, TypeScript derleyicisi aşağıdakileri katı bir şekilde talep eder:

  • Bu yöntemlere geçirilen argümanlar, yöntem imzasıyla tamamen uyumlu olmalıdır.
  • Fazla, eksik veya türü karışık argümanlar geçirilemez.
  • this parametresi mutlaka bağlamın türüyle uyumlu olmalıdır.

Kod Örneği:

function sum(a: number, b: number): number { return a + b; } const sum2 = sum.bind(null, 1); sum2(2); // TAMAM sum2(2, 3); // strictBindCallApply'de HATA

Ana Özellikler:

  • Derleme aşamasında bind/call/apply ile fazla veya yanlış argümanların geçişini engeller;
  • Kısmi uygulama sırasında this ve fonksiyon parametrelerinin desteklenmesini iyileştirir;
  • bind/call/apply sonucunun doğru bir şekilde tiplenmiş olmasını garanti eder.

Kandırmaca Soruları.

strictBindCallApply sadece fonksiyonlar için mi çalışır, yoksa sınıf yöntemlerini de etkiler mi?

Hem fonksiyonlar hem de yöntemler için geçerlidir, çünkü bind/call/apply yöntemleri herhangi bir fonksiyonda mevcuttur (Function.prototype). Bu, bağımsız fonksiyonlar ve sınıf yöntemleri için de geçerlidir.

strictBindCallApply parametresi katı mod strict olmadan etkinleştirilebilir mi?

Hayır, onun etkinleştirilmesi için strict=true veya tsconfig.json’da strictBindCallApply=true doğrudan belirtilmelidir.

Eğer bind ile belirlenen işlevde tanımlanandan fazla parametre geçilirse ne olur?

strictBindCallApply etkinleştirildiğinde, TypeScript derleyicisi bir hata verir: "X argümanı bekleniyordu, ama Y alındı". Bu, yaygın bir hata olan uzun imza veya tesadüfen fazla değişkenlerin yakalanmasını korur.

Tipik Hatalar ve Anti-Desenler

  • Fonksiyon aşırı yüklemesini taklit etmek için fazla parametreler ile bind kullanmak;
  • call/apply sırasında, parametrelerin tanımsız türü nedeniyle argümanların sırasını ihlal etmek;
  • this türünü örtük olarak göz ardı etmek (özellikle ok fonksiyonları kullanıldığında).

Gerçekten Bir Örnek

** Negatif Durum Geliştirici, argümanları kısmi uygulamak için .bind kullanıyor, ama sayısında hata yaptı. Normal modda hatalar yok, ama prodüksiyonda fonksiyon fazla bir parametre ile çağrıldığında mantık bozuluyor.

Artılar:

  • bind/apply ile daha esnek fonksiyon uygulamaları, imzayı düşünmeyi gerektirmiyor.

Eksiler:

  • Tuzaklar hata ayıklaması zor, prodüksiyonda bir hata oluşabilir.

** Pozitif Durum strictBindCallApply etkinleştirildiğinde, fonksiyonlar ve yöntemler bind’i katı bir biçimde imzaya göre kullanır: fazla veya yanlış argümanlar derleme aşamasında elenir.

Artılar:

  • Hatalar derleme sırasında, kod prodüksiyona girmeden görünür;
  • Kod güvenilirliği artar, hata ayıklama çok daha kolaydır.

Eksiler:

  • Eski kodun yavaş yavaş "düzeltilmesi", bazen projenin bir kısmında yeniden yapılandırma gerektirebilir.