TypeScript Özel Sınıf Özellikleri

Typescript, sınıflar için özel özellikleri destekler

Typescript sınıflarında erişim kontrolü

Birçok programlama dili, sınıflarının özelliklerini varsayılan olarak özel olarak tanımlar. Bunları örneğin dışından erişilebilir kılmak için, genellikle ilgili özellikleri "public" anahtar kelimesiyle işaretlemeniz gerekir.

Aynı anahtar kelime Typescript sınıflarında da mevcuttur, ancak Typescript sınıflarındaki özellikler varsayılan olarak herkese açık olduğundan fazla bir etkisi yoktur. Bu kısıtlama, sınıflardaki özel özellikleri desteklemeyen Javascript'ten devralınır. Yakın zamana kadar.

Javascript'te özel alanlar?

Evet ve hayır. Şu anda, Javascript sınıflarında özel özellikleri tanımlayan bir spesifikasyon için çalışan bir taslak, 3. aşamadadır; bu, nihai bir tanımın makul olduğunu, ancak henüz kesin olmadığını gösterir.

Spesifikasyonda önerilen değişiklikler gerçekten basittir ve sözdizimini yalnızca biraz değiştirir. Bir mülkü özel olarak işaretlemek için önüne bir hashtag eklemeniz yeterlidir. Bu kadar!

class User {
  // A prop marked as private.
  #id;
  age;
  
  constructor(age){
    this.age = age;
    // Valid assignment, as we're 
    // within the class.
    this.#id = Math.floor(Math.random() * 1000);
  }
}

// ... Later in the code ...

const user = new User(42);
// Error! Won't work as it's private.
user.#id = 123;

TypeScript'te özel alanlar!

Aynı sözdizimi, TypeScript'teki özel mülkler için de geçerlidir. 3.8 sürümünden bu yana, statik alanların yanı sıra örnekler için özelliklere ve işlevlere erişimi daha iyi kontrol etmek için bu özelliği kullanabilirsiniz. Sözdizimi Javascript örneğindekiyle aynıdır.

Bir dakika lütfen, özel statik alanlar?

Evet, doğru okudunuz: statik değişkenler ve işlevler de özel olabilir, bu da yalnızca sınıfın üyeleri içinde çağrılabilecekleri anlamına gelir. Bu özellik, kaputun altındaki diğer değişikliklerle birlikte TypeScript sürüm 4.3 ile eklenmiştir. Sürüm 4.3 belgelerine göre, özel sınıf üyeleri artık çalışma zamanında gerçekten özeldir ve bu, bu özelliğin tamamen olgunlaştığını gösterir.

Typescript'in sınıflar için iki farklı "private" türünü desteklediğini lütfen unutmayın. Yaygın olarak bilineni, işaretli alanları türetilmiş sınıflardan bile erişilemez tutan "private" anahtar kelimesidir.

Burada gösterdiğim ve yeni olan bir diğer özellik ise "özel adların" kullanılmasıdır. Spesifikasyonları orijinal olarak JS tarafından tanımlandığından, Javascript ile aynı sözdizimine sahiptirler. Typescript'te, çalışma zamanı sırasında erişimi kontrol ederler.

/**
 * A class that uses already known
 * private props.
 */
class CommonUser {
  // Common 'private' prop in TS.
  private id: number;
  age: number;
  
  constructor(age: number){
    this.age = age;
    this.id = Math.floor(Math.random() * 1000);
  }
}

/**
 * Using the new sytanx for private class names.
 */
class SpecialUser {
  #id: number;
  age: number;
  
  constructor(age: number){
    this.age = age;
    // Valid, we're inside the class.
    this.#id = SpecialUser.#generateId();
  }
  
  static #generateId(){
    return Math.floor(Math.random() * 1000);
  }
  
  #stringifyId(){
    return this.#id.toString();
  }
}

// ... Later in the code ...

// Invalid, call is outside of class 'SpecialUser'.
SpecialUser.#generateId();

const user = new SpecialUser(42);
// And that won't work as well.
user.#stringifyId();

Son bölüm için son sözler

Bu makale çok uzun değil, ancak Typescript'in sunduğu harika bir özelliğin yanı sıra TypeScript'in daha genel bir avantajını da vurguluyor. Javascript için özel mülkler hala bir taslaktır (çok geç bir aşamada olsa da), ancak Typescript için zaten uygulanmış ve gönderilmiştir, bu da bu dilin gelişme hızını gösterir!