Tajpaj Privataj Klasaj Propraĵoj

Tajpa teksto subtenas privatajn propraĵojn por klasoj

Alira kontrolo en tajpaj klasoj

Multaj programlingvoj difinas propraĵojn de ĝiaj klasoj kiel privatajn defaŭlte. Por fari ilin alireblaj de ekster la kazo, vi kutime devas marki la koncernajn propraĵojn per la ŝlosilvorto "publika".

La sama ŝlosilvorto ankaŭ haveblas en tajpaj klasoj, sed ne multe efikas, ĉar ecoj en tajpaj tajpoj estas publikaj defaŭlte. Ĉi tiu limo estas heredita de Ĝavaskripto, kiu ne subtenas privatajn propraĵojn en klasoj. Nu, ĝis antaŭ nelonge.

Privataj kampoj en Ĝavaskripto?

Jes kaj ne. Nuntempe laborprojekto por specifo, kiu difinas privatajn propraĵojn en klasoj de Javaskripto, estas en etapo 3, kio indikas, ke fina difino estas kredinda, sed ankoraŭ ne certa.

La proponitaj ŝanĝoj en la specifo estas vere simplaj kaj nur iomete modifas la sintakson. Por marki nemoveblaĵon kiel privatan, simple prefiksu ĝin per hashtag. Jen ĝi!

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;

Privataj kampoj en Tajpskribo!

La sama sintakso validas por privataj propraĵoj en Tajposkripto. Ekde versio 3.8, vi povas uzi ĉi tiun funkcion por pli bone regi aliron al propraĵoj kaj funkcioj por kazoj kaj ankaŭ statikaj kampoj. La sintakso estas la sama kiel en la Javaskripta ekzemplo.

Unu momenton bonvolu, privataj statikaj kampoj?

Jes, vi bone legis: statikaj variabloj kaj funkcioj ankaŭ povas esti privataj, kio signifas, ke ili povas esti nomataj nur ene de la membroj de la klaso. Ĉi tiu funkcio estis aldonita kun Typescript-versio 4.3, kune kun pliaj ŝanĝoj sub la kapuĉo. Laŭ la dokumentaro por versio 4.3, privataj klasanoj nun estas vere privataj dum rultempo, kio indikas, ke ĉi tiu funkcio plene maturiĝis.

Bonvolu noti, ke Typescript subtenas du malsamajn variantojn de "privata" por klasoj. La komune konata estas kun la ŝlosilvorto "privata", kiu tenas la markitajn kampojn neatingeblaj eĉ de derivitaj klasoj.

La alia funkcio, kiu estas tiu, kiun mi montras ĉi tie kaj kiu estas nova, estas la uzado de tiel nomataj "privataj nomoj". Ili estas la sama sintakso kiel por Ĝavaskripto, ĉar ilia specifo estis difinita de JS origine. En Tajposkripto, ili kontrolas la aliron dum rultempo.

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

Lastaj vortoj por la lasta ĉapitro

Ĉi tiu artikolo ne estas tre longa, sed elstarigas bonegan funkcion Typescript nun kaj pli ĝeneralan avantaĝon de Typescript mem. Por Ĝavaskripto, privataj nemoveblaĵoj ankoraŭ estas projekto (kvankam en tre malfrua stadio), sed por Tajpskribo ili jam estas efektivigitaj kaj senditaj, kio montras la rapidon kun kiu ĉi tiu lingvo evoluas!