How to

Enums vs Object typing u typescript-u

Zašto biste se trebali odmaknuti od jedne od većih funkcionalnosti typescript-a? Što bi bila bolja alternativa enuma? Pročitajte više u ovoj blog objavi.

Enums vs Object typing u typescript-u

Ključne riječi:

AS Agency
Enums
Typescript
Object types

1. Što su TypeScript Enums?

Enums u TypeScript-u vam omogućuju definiranje niza imenovanih konstanti. Iako to može zvučati praktično, enums često uključuju skrivene složenosti koje mogu utjecati na performanse i debugging.

1enum Environment {
2  PRODUCTION = "PRODUCTION",
3  DEVELOP = "DEVELOP",
4  STAGE = "STAGE"
5}

Na prvi pogled, ovaj jednostavan isječak koda može izgledati bezopasno. Međutim, enumi mogu generirati dodatni JavaScript kod tijekom procesa transpilacije, što može rezultirati složenim problemima s otklanjanjem pogrešaka i razlikama u različitim build okruženjima.

1export var Environment;
2(function (Environment) {
3    Environment["PRODUCTION"] = "PRODUCTION";
4    Environment["DEVELOP"] = "DEVELOP";
5    Environment["STAGE"] = "STAGE";
6})(Environment || (Environment = {}));

To je ono u što se kompajlira typecript enum. Zašto ovako? Da bismo odgovorili na ovo pitanje, moramo ići dublje od ovog primjera. Što bi se dogodilo kada bismo ovo imali kao enum?

1enum Environment {
2  PRODUCTION,
3  DEVELOP,
4  STAGE
5}

Što mislite da bi se dogodilo kada se ovo kompajlira?

1"use strict";
2var Environment;
3(function (Environment) {
4    Environment[Environment["PRODUCTION"] = 0] = "PRODUCTION";
5    Environment[Environment["DEVELOP"] = 1] = "DEVELOP";
6    Environment[Environment["STAGE"] = 2] = "STAGE";
7})(Environment || (Environment = {}));
8

Nije ono što ste očekivali, zar ne? Ovaj bi vas output mogao još više zbuniti, ali kada enum okruženja pretvorite u objekt, dobit ćete ovaj output

1{
2  "0": "PRODUCTION",
3  "1": "DEVELOP",
4  "2": "STAGE",
5  "PRODUCTION": 0,
6  "DEVELOP": 1,
7  "STAGE": 2
8} 

Zato postoje dodjele brojeva, ti brojevi predstavljaju indeks unutar enuma.

Kako koristite enum kao tip?

1const getEnvironmentData = (env: Environment)=>{}
2
3// Radi ✅
4getEnvironmentData(0)
5getEnvironmentData(Environment.PRODUCTION)
6
7// Ne radi ❌
8getEnvironmentData("PRODUCTION")

Postoji način za uklanjanje dodatnog koda korištenjem

1const enum Environment {
2  PRODUCTION = "PRODUCTION",
3  DEVELOP = "DEVELOP",
4  STAGE = "STAGE"
5}

Ali ovo uvodi dodatne probleme s rubnim slučajem jer uklanja cijeli objekt u vremenu izvođenja.

2. Introducing Typed Objects

Tipizirani objekti koriste značajku as const u TypeScriptu, osiguravajući da vrijednosti ostanu literalne vrste. Ovaj pristup nudi jasnoću i održava vaš JavaScript output predvidljivim.

1const Environment = {
2  PRODUCTION: "PRODUCTION",
3  DEVELOPMENT: "DEVELOPMENT",
4  STAGE: "STAGE"
5} as const;

Korištenjem ove as const anotacije, svaka se vrijednost u objektu tretira kao literalni tip, održavajući sigurnost tipa bez dodatnih troškova koji dolaze s enumima. Kada se kompajlira, ovo je output, bez dodatnog koda.

Iako ovo uklanja dodatnu složenost krajnjeg kompajliranog koda, raw objekt ne može se izravno koristiti kao tip, moramo napraviti neke manipulacije tipom. Za korištenje kao tipa na način na koji se koristi enum potreban je dodatni kod.

1const Environment = {
2  PRODUCTION: "PRODUCTION",
3  DEVELOPMENT: "DEVELOPMENT",
4  STAGE: "STAGE"
5} as const;
6
7type TEnviroment =  typeof Environment[keyof typeof Environment]
8
9const getEnvironmentData = (env:  TEnviroment)=>{}

Ovako možemo izvući tip iz objekta, kako ćemo ga sada koristiti?

1const getEnvironmentData = (env:  TEnviroment)=>{}
2
3getEnvironmentData('PRODUCTION')
4getEnvironmentData(Environment.PRODUCTION)

Kao što vidite, možete ga upisati kao enum, ali opet mu možete dati string verziju vrijednosti jer je u ovom slučaju "PRODUCTION" također valjan tip. To znači da vam nije potreban dodatni import samo da biste dobili enum vrijednost.

Zaključak

To ne znači da više ne možete ili ne biste trebali koristiti enume. Ovaj post na blogu želi vam pokazati da postoje druga, bolja rješenja.

Korištenjem tipiziranih objekata umjesto enuma, dobivate:

  • Čišći završni kod
  • Lakše debuggirnje
  • Bolji type safety
  • Lakše održavanje koda

U AS Agency, vjerujemo da ove prednosti pridonose izgradnji skalabilnih, pouzdanih aplikacija spremnih na budućnost. Tipizirani objekti samo su jedan primjer kako ostajemo na vrhuncu najboljih praksi TypeScripta kako bismo svojim klijentima pružili usluge web-razvoja vrhunske kvalitete.