Soru tarihçesi:
Static özellikler ve metodlar, JavaScript sınıflarında ES6'dan itibaren ortaya çıkmıştır, ancak bu elemanların katı tiplendirilmesi TypeScript sayesinde mümkün olmuştur. Dinamik JavaScript'te statik elemanlar sınıfın statik olmayan elemanlarından tip olarak farklı değildir, ancak TypeScript, statik üyeleri dikkate alarak sınıfların tip güvenliğini ve yapısını eklemeye olanak tanır.
Sorun:
Static özellikler ve metodlar, sınıfa ait olup, onun örneklerine ait değildir. Ancak birçok geliştirici, örneğin tiplendirmesini (this veya yapıcı aracılığıyla) ve sınıfın kendisini nesne olarak tiplendirmeyi karıştırır. Bu bazen statik alanlara metodlar içerisinde veya miras alırken erişimle ilgili hatalara yol açar.
Çözüm:
TypeScript'te, statik sınıf üyeleri, statik olmayanlardan ayrı olarak tiplendirilir:
Kod örneği:
class User { static count: number = 0; name: string; constructor(name: string) { this.name = name; User.count++; } static getCount(): number { return User.count; } } function createUserClass(): typeof User { return User; }
Temel özellikler:
Static metodlar doğrudan statik olmayan sınıf özellikleriyle çalışabilir mi?
Hayır, static metodlar, this'in sınıfa (yapıcıya) işaret etmesi nedeniyle, statik olmayan özelliklere erişim sağlayamaz. Statik olmayan özelliklerle çalışmak için nesne örnekleriyle çalışmak gereklidir.
class Demo { static demoStatic() { // this.value; // Hata — value statik değil } }
Static bir özelliğe sınıfın örneği aracılığıyla erişebilir miyiz?
Hayır, statik özelliklere yalnızca sınıfın kendisi aracılığıyla erişim sağlanır, nesne örneği aracılığıyla değil:
const u = new User('Max'); console.log(u.count); // Hata console.log(User.count); // Tamam
Sınıfın miras alınması sırasında static metodları miras almak ve geçersiz kılmak mümkün mü?
Evet, static metodlar miras alınabilir ve geçersiz kılınabilir ve bu beklenildiği gibi çalışır:
class Animal { static who() { return 'Animal'; } } class Dog extends Animal { static who() { return 'Dog'; } } console.log(Dog.who()); // 'Dog'
Geliştirici, oluşturulan örneklerin sayacını normal bir örnek özelliği olarak saklar, static olarak değil. Her nesne oluşturulduğunda alan artırılır, ancak sınıfın tüm nesneleri için senkronize değildir.
Artıları:
Eksileri:
Tüm nesneleri saymak için static count kullanımı, yapıcıda doğru bir şekilde artırma ve sayaç almak için statik bir metod kullanımıdır.
Artıları:
Eksileri: