Μην χρησιμοποιείτε το ENUMS στο Typescript, είναι πολύ επικίνδυνα

Έχετε αναρωτηθεί ποτέ γιατί οι ειδικοί του TypeScript συνιστούν την αποφυγή της χρήσης ENUM; Αν και μπορεί να φαίνονται χρήσιμο εργαλείο για τον καθορισμό ενός συνόλου σταθερών τιμών, στην πραγματικότητα είναι πολύ επικίνδυνα. Σε αυτό το άρθρο, θα σας δείξουμε γιατί και πώς να αποφύγετε τη χρήση τους. Θα ανακαλύψετε ότι υπάρχουν πολύ πιο ασφαλείς και αξιόπιστες εναλλακτικές λύσεις που μπορείτε να χρησιμοποιήσετε. Ετοιμαστείτε να εκπλαγείτε!

Ο κωδικός εκπομπής του Enum

Ένας από τους λόγους για τους οποίους συνιστάται η μη χρήση του οφείλεται στη δημιουργία κώδικα κατά τη στιγμή της μεταγλώττισης της εφαρμογής. Τα ENUM δημιουργούν πρόσθετο κώδικα κατά το χρόνο μεταγλώττισης, ο οποίος αυξάνει το μέγεθος του τελικού αρχείου. Αυτό μπορεί να έχει αρνητικό αντίκτυπο στην ταχύτητα φόρτωσης και στην απόδοση της εφαρμογής.

Καθορίστε τον αριθμό Ρόλων μας

enum Roles {
  Admin,
  Writer,
  Reader
}

Έξοδος (Κώδικας που δημιουργείται από την κατασκευή)

var Roles;
(function (Roles) {
    Roles[Roles["Admin"] = 0] = "Admin";
    Roles[Roles["Writer"] = 1] = "Writer";
    Roles[Roles["Reader"] = 2] = "Reader";
})(Roles|| (Roles = {}));

Αν και είναι αλήθεια ότι αυτή η λεπτομέρεια διορθώνεται αν χρησιμοποιείτε σταθερό enum, αλλά έχω πάει σε πολλά έργα και έχω δει ανθρώπους να χρησιμοποιούν κανονικά enum παντού και αναρωτιέμαι γιατί η παραγωγή τους είναι τόσο μεγάλη. Postada: Ήμουν ένας από αυτούς τους ανθρώπους. 😁

Αυτό μπορεί να φαίνεται ασήμαντο, αλλά φανταστείτε ότι έχετε κοινά αρχεία μεταξύ του "Frontend" και του "Backend" και μπορείτε να καταλήξετε με αρκετά βαριά πακέτα.

Εντάξει, αυτό είναι ένα πράγμα, και μπορούμε να το χειριστούμε επιβάλλοντας τις σταθερές. Υπάρχει όμως και αυτή η δυσάρεστη ασάφεια.

Αριθμητικοί τύποι usafe

Ναι καλά διαβάσατε. Αυτό δεν είναι clickbait. Τα κανονικά αριθμητικά πλήκτρα, όπως σε ένα enum όπου δεν ορίζετε τιμές συμβολοσειράς, δεν είναι ασφαλή! Αν κοιτάξουμε πίσω στην απαρίθμηση ρόλων από προηγούμενες, μια συνάρτηση που παίρνει ρόλους χρήστη παίρνει επίσης οποιαδήποτε αριθμητική τιμή.

enum Roles {
  Admin,
  Writer,
  Reader
}

declare function hasAccess(role: Roles): void;

hasAccess(10);
// ☝️ Worst of all, this is ok! 😱

Όπως ίσως έχετε παρατηρήσει, όταν καλείται η συνάρτηση hasAccess(10), μεταβιβάζεται μια αριθμητική τιμή που δεν αποτελεί μέρος των ρόλων enum, αυτό επιτρέπεται στο TypeScript και αυτό θεωρείται ένα πρόβλημα, καθώς επιτρέπει την εισαγωγή μη αναμενόμενων και μη επαληθευμένων τιμών που μπορεί να προκαλέσουν προβλήματα ασφάλειας και απόδοσης στην εφαρμογή.

Οι συμβολοσειρές ENUM ονομάζονται τύποι

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

enum Roles {
  Admin = 'admin',
  Writer = 'writer',
  Reader = 'reader'
}

declare function hasAccess(role: Roles): void;

hasAccess('admin') // Invalid.
hasAccess(Roles.Admin) // Valid.

Όπως μπορείτε να δείτε, τα enum είναι ένας επώνυμος τύπος και δέχονται μόνο τιμές που αφορούν το enum, όχι συμβατές ή παρόμοιες τιμές, οι οποίες μπορεί να οδηγήσουν σε ζητήματα συμβατότητας και θα πρέπει να λαμβάνονται προσεκτικά υπόψη κατά το σχεδιασμό και τη χρήση των enum.

Λύση

Μια πολύ πιο ασφαλής εναλλακτική και εγγύηση συμβατότητας είναι η χρήση αντικειμένων. Ας δούμε το παρακάτω παράδειγμα:

const Roles = {
  Admin: "admin",
  Writer: "writer",
  Reader: "reader"
} as const;

// Convert object key in a type
type RoleKeys = typeof Roles[keyof typeof Roles]

declare function hasAccess(role: RoleKeys): void;

// 💥 Error!
move('guest');

// 👍 Great!
move('admin');

// 👍 Also great!
move(Roles.Admin);

συμπέρασμα

Τα ENUM μπορεί να φαίνονται χρήσιμο εργαλείο για τον καθορισμό ενός συνόλου σταθερών τιμών, αλλά στην πραγματικότητα είναι πολύ επικίνδυνα. Η υπερβολική χρήση των τακτικών ENUM μπορεί να οδηγήσει σε ζητήματα μεγέθους κώδικα, ζητήματα ασφάλειας, ζητήματα επεκτασιμότητας και προβλήματα συντήρησης.

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

Ακολουθήστε με❤️

  • "Κελάδημα". 🐦
  • Github. 🐙