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:
- zatvoren skup dobro poznatih vrijednosti (koji kasnije neće dopuštati tipografske pogreške), pri čemu svaka ima...
- odgovarajući skup tipova sličnih doslovnim za svakog člana, svi su pruženi...
- 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);
}
