Tikskrif Privaat Klas Eiendomme

Tikskrif ondersteun privaat eiendomme vir klasse

Toegangsbeheer in Typescript-klasse

Baie programmeertale definieer die klasse se eienskappe standaard as privaat. Om dit van buite die instansie toeganklik te maak, moet u die toepaslike eienskappe met die trefwoord 'publiek' merk.

Dieselfde sleutelwoord is ook beskikbaar in Typescript-klasse, maar het nie 'n groot invloed nie, aangesien eienskappe in Typescript-klasse standaard openbaar is. Hierdie beperking is geërf van Javascript, wat nie private eiendomme in klasse ondersteun nie. Wel, tot onlangs toe.

Privaat velde in Javascript?

Ja en nee. Tans is 'n werkopstel vir 'n spesifikasie wat private eiendomme in Javascript-klasse definieer, in fase 3, wat daarop dui dat 'n finale definisie aanneemlik is, maar nog nie seker is nie.

Die voorgestelde veranderinge in die spesifikasie is regtig eenvoudig en wysig die sintaksis net effens. Om 'n eiendom as privaat te merk, moet u dit net met 'n hutsmerk voorvoeg. Dis dit!

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;

Privaat velde in tikskrif!

Dieselfde sintaksis geld vir privaat eiendomme in Typescript. Sedert weergawe 3.8 kan u hierdie funksie gebruik om toegang tot eienskappe en funksies vir gevalle sowel as statiese velde beter te beheer. Die sintaksis is dieselfde as in die Javascript-voorbeeld.

Een oomblik asseblief, private statiese velde?

Ja, u het reg gelees: statiese veranderlikes sowel as funksies kan ook privaat wees, wat beteken dat hulle slegs binne die klas se lede genoem kan word. Hierdie funksie is bygevoeg met die Typescript weergawe 4.3, tesame met verdere veranderinge onder die kap. Volgens die dokumentasie vir weergawe 4.3 is private klaslede nou regtig privaat tydens looptyd, wat daarop dui dat hierdie funksie ten volle verouder is.

Let daarop dat Typescript twee verskillende variante van 'privaat' vir klasse ondersteun. Die algemeen bekende is met die trefwoord "privaat", wat die gemerkte velde nie toeganklik hou nie, selfs nie uit afgeleide klasse nie.

Die ander kenmerk, dit is die een wat ek hier vertoon en wat nuut is, is die gebruik van sogenaamde 'private name'. Dit is dieselfde sintaksis as vir Javascript, aangesien hul spesifikasie oorspronklik deur JS gedefinieer is. In Typescript beheer hulle die toegang tydens looptyd.

/**
 * 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();

Laaste woorde vir die laaste hoofstuk

Hierdie artikel is nie baie lank nie, maar beklemtoon 'n uitstekende kenmerk wat Typescript nou bied, sowel as 'n meer algemene voordeel van Typescript self. Vir Javascript is privaat eiendomme nog steeds 'n konsep (al is dit in 'n baie laat stadium), maar vir Typescript word dit reeds geïmplementeer en versend, wat wys hoe vinnig hierdie taal ontwikkel!