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:
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
#field, ancak bu artık bir JS spesifikasyonudur ve farklı bir şekilde derlenir.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!
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.assignile üzerine yazarak zor keşfedilecek bir hata aldı. Bunun olmasının sebebi çalışma zamanında kapsüllemenin olmamasıydı.