Ιδιότητες κατηγορίας ιδιωτικής κατηγορίας

Το Typescript υποστηρίζει ιδιωτικές ιδιότητες για τάξεις

Έλεγχος πρόσβασης σε κλάσεις Typescript

Πολλές γλώσσες προγραμματισμού ορίζουν τις ιδιότητες των κατηγοριών ως ιδιωτικές από προεπιλογή. Για να τις κάνετε προσβάσιμες εκτός της παρουσίας, συνήθως πρέπει να επισημάνετε τις σχετικές ιδιότητες με τη λέξη-κλειδί "δημόσια".

Η ίδια λέξη-κλειδί είναι επίσης διαθέσιμη σε τάξεις Typescript, αλλά δεν έχει μεγάλο αντίκτυπο, καθώς οι ιδιότητες στις τάξεις Typescript είναι δημόσιες από προεπιλογή. Αυτός ο περιορισμός κληρονομείται από το Javascript, το οποίο δεν υποστηρίζει ιδιωτικές ιδιότητες σε τάξεις. Λοιπόν, μέχρι πρόσφατα.

Ιδιωτικά πεδία σε Javascript;

Ναι και ΟΧΙ. Επί του παρόντος, ένα προσχέδιο εργασίας για μια προδιαγραφή που ορίζει ιδιωτικές ιδιότητες σε τάξεις Javascript βρίσκεται στο στάδιο 3, το οποίο δείχνει ότι ο τελικός ορισμός είναι εύλογος, αλλά δεν είναι ακόμη σίγουρος.

Οι προτεινόμενες αλλαγές στις προδιαγραφές είναι πραγματικά απλές και τροποποιούν ελαφρώς τη σύνταξη. Για να επισημάνετε μια ιδιότητα ως ιδιωτική, απλώς προθέστε την με ένα hashtag. Αυτό είναι!

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!

Η ίδια σύνταξη ισχύει για ιδιωτικές ιδιότητες στο Typescript. Από την έκδοση 3.8, μπορείτε να χρησιμοποιήσετε αυτήν τη δυνατότητα για τον καλύτερο έλεγχο της πρόσβασης σε ιδιότητες και λειτουργίες για παρουσίες καθώς και στατικά πεδία. Η σύνταξη είναι ίδια με το παράδειγμα Javascript.

Μία στιγμή παρακαλώ, ιδιωτικά στατικά πεδία;

Ναι, έχετε διαβάσει σωστά: οι στατικές μεταβλητές καθώς και οι συναρτήσεις μπορούν να είναι ιδιωτικές, πράγμα που σημαίνει ότι μπορούν να κληθούν μόνο εντός των μελών της τάξης. Αυτή η δυνατότητα προστέθηκε με το Typescript έκδοση 4.3, μαζί με περαιτέρω αλλαγές κάτω από την κουκούλα. Σύμφωνα με την τεκμηρίωση για την έκδοση 4.3, τα μέλη της ιδιωτικής τάξης είναι πλέον πραγματικά ιδιωτικά στο χρόνο εκτέλεσης, πράγμα που δείχνει ότι αυτή η δυνατότητα έχει ωριμάσει πλήρως.

Λάβετε υπόψη ότι το Typescript υποστηρίζει δύο διαφορετικές παραλλαγές του "ιδιωτικού" για τάξεις. Το ευρέως γνωστό είναι με τη λέξη-κλειδί "ιδιωτική", η οποία διατηρεί τα πεδία με σήμανση μη προσβάσιμα ακόμη και από παράγωγες τάξεις.

Το άλλο χαρακτηριστικό, το οποίο εμφανίζεται εδώ και το οποίο είναι νέο, είναι η χρήση των λεγόμενων «ιδιωτικών ονομάτων». Είναι η ίδια σύνταξη με το Javascript, καθώς η προδιαγραφή τους ορίστηκε από τον JS αρχικά. Στο Typescript, ελέγχουν την πρόσβαση κατά τη διάρκεια του χρόνου εκτέλεσης.

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

Τελευταίες λέξεις για το τελευταίο κεφάλαιο

Αυτό το άρθρο δεν είναι πολύ μεγάλο, αλλά επισημαίνει μια εξαιρετική δυνατότητα που προσφέρει τώρα το Typescript, καθώς και ένα γενικότερο πλεονέκτημα του ίδιου του Typescript. Για το Javascript, οι ιδιωτικές ιδιότητες εξακολουθούν να είναι προσχέδιο (αν και σε πολύ αργό στάδιο), αλλά για το Typescript έχουν ήδη εφαρμοστεί και αποσταλεί, κάτι που δείχνει την ταχύτητα με την οποία εξελίσσεται αυτή η γλώσσα!

Προτάσεις

Σχετικά

Προσάρτημα

Γλώσσες