ProgramlamaFrontend geliştirici

TypeScript'te erişim modifikatorları (public, private, protected) nasıl çalışır? Kalıtım ve JavaScript'e kodun derlenmesiyle kullanımında hangi nüanslar vardır?

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

Cevap

TypeScript'te erişim modifikatorleri, sınıflardaki özelliklerin ve yöntemlerin görünürlük alanını kısıtlamak için kullanılır:

  • public — özellik veya yöntem her yerde erişilebilir (varsayılan).
  • private — yalnızca tanımlandığı sınıfta erişilebilir.
  • protected — sınıfta ve onun miras alanlarında erişilebilir.
class Animal { public name: string; private age: number; protected kind: string; constructor(name: string, age: number, kind: string) { this.name = name; this.age = age; this.kind = kind; } } class Dog extends Animal { bark() { console.log(this.kind); // TAMAM: protected // console.log(this.age); // HATA: private mirasta görünmüyor } } const dog = new Dog('Şarik', 5, 'memeli'); console.log(dog.name); // TAMAM // console.log(dog.kind); // HATA: protected // console.log(dog.age); // HATA: private

Nüanslar:

  • Derlenmiş JavaScript'te private ve protected modifikatorleri yalnızca derleme aşamasında uygulanır; çalışma zamanında fiziksel bir izolasyon yoktur! JS kodu, özellikleri içerecek şekilde yazılacaktır (örneğin, objeyi dolaşarak alınabilir).
  • Yeni sürümlerde (TypeScript 3.8 ile) gerçek özel alanlar için bir sözdizimi eklenmiştir: #field, ancak bu artık bir JS spesifikasyonudur ve farklı bir şekilde derlenir.

Kandırıcı Soru

Soru: TypeScript sınıfının private özelliğine JavaScript'e derlendikten sonra erişim mümkün mü?

Cevap: Evet, çünkü private (ve protected) — TypeScript'teki derleme aşamasındaki bir kontrol olup, ES5 veya ES6'ya derlendikten sonra özelilik korunmaz, özellikler nesnede kalır ve isimle erişilebilir (örneğin, object['privateProp'] ile).

// Derlemeden sonra JS kodu function Animal(name, age, kind) { this.name = name; this.age = age; this.kind = kind; } var dog = new Animal('Şarik', 5, 'memeli'); console.log(dog['age']); // 5 — sadece TS seviyesinde erişim yok!

Bilinçsizlikten kaynaklanan gerçek hata örnekleri.


Hikaye

Büyük bir projede geliştirici, private alanların çalışma zamanında erişilemeyeceği gerçeğine güveniyordu. Sonuç olarak, nesneyi serileştirirken (JSON.stringify) günlük kaydına yanlışlıkla gizli bilgiler düştü, çünkü TS tür kontrolü alanlara gerçek erişimi engellemedi.


Hikaye

Bir projede sınıf örneklerinin dinamik özellik ekleyerek „genişletilmesi“ mekanizması uygulandı. Dinamik olarak eklenen özellikler private adları üzerine yazdı ve dış kod tarafından yanlışlıkla değiştirildi. Hata yalnızca üretim ortamında keşfedildi ve özelilik sağlanamadı.


Hikaye

JavaScript'ten TypeScript'e geçişte ekip, alanların alt sınıfların dışında kullanılmalarından korunduğunu düşünerek protected kullanmaya başladı. Ancak bir programcı, çalışma zamanında yanlışlıkla protected alanı Object.assign ile üzerine yazarak zor keşfedilecek bir hata aldı. Bunun olmasının sebebi çalışma zamanında kapsüllemenin olmamasıydı.