koje je značenje enum-a u TypeScriptu


čemu služi enum u TypeScriptu. Ako je njegova svrha samo da kod bude čitljiv, zar ne možemo samo koristiti konstante za istu svrhu

enum Color {
Red = 1, Green = 2, Blue = 4
};


let obj1: Color = Color.Red;
obj1 = 100; // does not show any error in IDE while enum should accept some specific values

Ako nema prednosti tipiziranja, zar se to ne može samo napisati kao.

const BasicColor = {
    Red: 1,
    Green: 2,
    Blue: 4
};

let obj2 = BasicColor.Red;

Odgovor #1

Prvo, u sljedećem:

const BasicColor = {
    Red: 1,
    Green: 2,
    Blue: 4
};

Red, Green i Blue su i dalje promjenjivi (dok u enumeraciji nisu).

Enumi također pružaju nekoliko stvari:

  1. zatvoren skup dobro poznatih vrijednosti (koji kasnije neće dopuštati tipografske pogreške), pri čemu svaka ima...
  2. odgovarajući skup tipova sličnih doslovnim za svakog člana, svi su pruženi...
  3. po jednoj nazvanoj vrsti koja obuhvaća sve vrijednosti

Da biste to dobili s nečim poput namespace-a, na primjer, morate učiniti nešto poput

export namespace Color
    export const Red = 1
    export type Red = typeof Red;

    export const Green = 2;
    export type Green = 2;

    export const Blue = 3;
    export type Blue = typeof Blue;
}
export type Color = Color.Red | Color.Blue | Color.Green

Ono što također primjećujete je neka nesretna naslijeđena ponašanja gdje TypeScript dopušta dodjeljivanje bilo koje numeričke vrijednosti numeričkom enumeratoru.

Ali ako koristite string enum, nećete dobiti to ponašanje. Postoje i druge stvari poput provjere iscrpnosti koje možete omogućiti s unijom enuma:

enum E {
  Hello = "hello",
  Beautiful = "beautiful",
  World = "world"
}

// if a type has not been exhaustively tested,
// TypeScript will issue an error when passing
// that value into this function
function assertNever(x: never) {
  throw new Error("Unexpected value " + x);
}

declare var x: E;
switch (x) {
  case E.Hello:
  case E.Beautiful:
  case E.World:
    // do stuff...
    break;
  default: assertNever(x);
}

Povezani članci