μ΄κ±°ν μλ£ν
const ADMIN = 0; const READ_ONLY = 1; const AUTHOR = 2; const person = { name: 'Maximilian', age: 30, hobbies: ['Sports', 'Cooking'], role: ADMIN // 0 };
enumμ΄ μμ΄ μ¬λμ΄ μ½κΈ° μ½κ² μ νκΈ° μν΄μλ μ«μννλ‘ μμ±ν΄μ£Όλκ² μ’λ€. μλνλ©΄ μ¬λλ§λ€ μ¬μ©νλ λ³μκ° λ€λ₯΄κΈ° λλ¬Έμ ν·κ°λ¦΄ μκ° μλ€.
κ·Έλμ λ³μλ₯Ό ν΅ν΄ μ«μννλ‘ ν λΉν μ μμ§λ§, μ½λκ° κΈΈμ΄μ§λ©΄ μ΄κ²λ§μ ν·κ°λ¦΄μκ°μλ€.
κ·Έλμ λ±μ₯νκ² enum μ΄κ±°ν μ΄λ€.
enum Role { ADMIN = 'ADMIN', READ_ONLY = 100, AUTHOR = 'AUTHOR' }; // Custom ννμ΄κΈ° λλ¬Έμ 첫κΈμλ₯Ό λλ¬Έμλ‘ μμ±νλ€. const person = { name: 'Maximilian', age: 30, hobbies: ['Sports', 'Cooking'], role: Role.ADMIN };
enumμ μ₯μ :
- CustomνμμΌλ‘ μμ±νκΈ°λλ¬Έμ, ν΄λΉ κ°μ²΄μ μ§μ νκ²λλ©΄ listλ₯Ό λ³Όμκ° μλ€.
μ½λλ₯Ό μλ₯Ό λ€λ©΄, Role.ADMIN , Role.READ_ONLY, Role.AUTHOR 리μ€νΈλ₯Ό IDEμμ νμΈ ν μ μλ€.
- μ«μλΏλ§μλλΌ λ¬Έμλ‘ κΈ°λ³Έκ°μ μ§μ ν μκ° μλ€. (μ€μ νμ§ μμΌλ©΄ 0λΆν° μ°¨λ‘λ‘ ν λΉλλ€.)
Enum
μ΄λμ C, Javaμ κ°μ λ€λ₯Έ μΈμ΄μμ ννκ² μ°μ΄λ νμ
μΌλ‘ νΉμ κ°(μμ)λ€μ μ§ν©μ μλ―Ένλ€.
enum Avengers {Capt, IronMan, Thor} let hero: Avengers = Avengers.capt let hero: Avengers = Avengers[0] //μ΄λμ μΈλ±μ€ λ²νΈλ‘ μ κ·Ό ν μ μλ€.
λ§μ½μ, μνλ€λ©΄ μ΄λμ μΈλ±μ€λ₯Ό μ¬μ©μ νΈμλ‘ λ³κ²½νμ¬ μ¬μ©ν μλ μλ€.
enum Avengers = { Capt = 2 , IronMan, Thor} let hero: Avengers = Avengers[2]; // Capt let hero: Avengers = Avengers[4]; // Thor
const Direction - { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT" } // μμμ§ν© const Direction2 - { Up : "UP", Down : "DOWN", Left : "LEFT", Right : "RIGHT" } //μμκ°μ²΄ const Direction3 = { Up, Down, Left, Right } // Enumμ λ©€λ²μ κ°μ ν λΉνμ§ μμΌλ©΄, νμ μ€ν¬λ¦½νΈκ° μλμΌλ‘ κ°μ ν λΉ νλ€. let myEnumVar = Direction3.Downl myEnumVar = "hello"; // "hello" νμμ 'Directioin3'νμμ λμ ν μ μμ.(μ€λ₯)
Enumμ μ¬μ©νλ©΄ νμ μ€ν¬λ¦½νΈκ° μ리νκ² λ€μμ κ²μ¬νλ€.
enum E { Foo, Bar } function f(x: E){ if( x!==E.Foo || x !== E.Bar){ // μ€λ₯ ! 'E.Foo'μ 'E.Bar'λ μλ‘ κ²ΉμΉμ§ μμΌλ―λ‘ μ΄ μ‘°κ±΄μ νμ 'μ°Έ'μ΄λ€. } }
μ νν κ²½μ°μ μλ₯Ό κ°λ κ°μ μ§ν©μ νννκΈ° μν΄ μ¬μ©νλ μ΄κ±°ν(enum) νμ
μ λν΄ λ°°μ΄λ€.
μ«μ μ΄κ±°ν(Numeric Enum)
μ«μ μ΄κ±°νμ number νμ
κ°μ κΈ°λ°ν μ΄κ±°νμ΄λ€.
λ§μ½ μ΄κ±°νμ μ μνλ©° λ©€λ²μ κ°μ μ΄κΈ°ννμ§ μμ κ²½μ°, ν΄λΉ λ©€λ²μ κ°μ 0λΆν° μμ°¨μ μΌλ‘ μ¦κ°νλ μ«μ κ°μ κ°λλ€.
μλ₯Ό λ€μ΄ μλ μμ λ μμ λ λμΌνκ² λμνλ€.
enum Direction { East, West, South, North } enum ExplicitDirection { East = 0, West = 1, South = 2, North = 3 }
μ΄λ κ² μ μν μ΄κ±°νμ λ©€λ²μλ κ°μ²΄μ μμ±μ μ κ·Όνλ κ²κ³Ό λμΌν λ°©μμΌλ‘ μ κ·Όν μ μλ€.
μ΄λ€ μ΄κ±°ν Enumμ λͺ¨λ λ©€λ²λ Enum νμ
μ κ°λλ€.
const south: Direction = Direction.South; console.log(south); // 2
λ©€λ² κ° μ΄κΈ°ν
0λΆν° μμλλ μλ μ΄κΈ°νμ μμ‘΄νλ λμ , κ° λ©€λ²μ κ°μ μ§μ μ΄κΈ°ν ν μ μλ€.
enum InitializedDirection { East = 2, West = 4, South = 8, North = 16 }
λ§μ½ μ΄κΈ°ν λμ§ μμ λ©€λ²κ° μμ¬μλ€λ©΄, κ·Έ λ©€λ²μ κ°μ μ΄μ μ μ΄κΈ°νλ λ©€λ²μ κ°μΌλ‘λΆν° μμ°¨μ μΌλ‘ μ¦κ°ν΄μ κ²°μ λλ€.
enum InitializedDirection2 { East = 3, West /* 4 */, South = 7, North /* 8 */ }
λ¬Έμμ΄ μ΄κ±°ν(String Enum)
number νμ
κ° λμ string νμ
κ°μ μ¬μ©ν΄μ λ©€λ² κ°μ μ΄κΈ°ννλ κ²λ κ°λ₯νλ€.
enum Direction { East = 'EAST', West = 'WEST', South = 'SOUTH', North = 'NORTH' }
λ¬Έμμ΄ μ΄κ±°νμ μ«μ μ΄κ±°νκ³Ό λ€μ λΆλΆμ μ μΈνκ³ λ λ§μ λΆλΆ λμΌνλ€.
- λ¬Έμμ΄μ βμλ μ¦κ°β μν¨λ€λ κ°λ μ μ±λ¦½νμ§ μλλ€. λ°λΌμ λ¬Έμμ΄ λ©€λ² μ΄νλ‘ μ μλ λͺ¨λ λ©€λ²λ λͺ μμ μΌλ‘ μ΄κΈ°νλμ΄μΌ νλ€.
- μ«μ μ΄κ±°νκ³Ό λ¬λ¦¬, λ¬Έμμ΄ μ΄κ±°νμ΄ μ»΄νμΌλ μλ°μ€ν¬λ¦½νΈ μ½λμλ κ° β ν€ μ μλ°©ν₯ λ§€ν(reverse mapping)μ΄ μ‘΄μ¬νμ§ μλλ€.
ν μ΄κ±°νμμ μ«μ λ©€λ²μ λ¬Έμμ΄ λ©€λ²λ₯Ό λͺ¨λ μ¬μ©νλ μμ μ΄ν μ΄κ±°ν(Heterogeneous Enum)λ λ¬Έλ² μ νμ©μ λλ€. νμ§λ§ μ΄ν μ΄κ±°νμ μ¬μ©ν΄ ν° μ΄λμ μ»μ μ μλ κ²½μ°λ λλ¬Όκ³ , λλΆλΆμ κ²½μ° νΌλμ λΆλ¬ μ¬ μ μμ΄ κΆμ₯λμ§ μλλ€.
μμ λ©€λ²μ κ³μ°λ λ©€λ²
μ§κΈκΉμ§ λ€λ£¬ μ΄κ±°νμ λ©€λ²λ λͺ¨λ λͺ
μμ μ΄λ , μμμ λ μ»΄νμΌ νμμ μ μ μλ μμκ°μΌλ‘ μ΄κΈ°ν λμλ€.
μ΄λ° μ΄κ±°ν λ©€λ²λ₯Ό μμ λ©€λ²(constant member)λΌ λΆλ₯Έλ€.
function getAnswer() { return 42; } enum SpecialNumbers { Answer = getAnswer(), Mystery // error TS1061: Enum member must have initializer. }
λ°νμμμμ μ΄κ±°ν
κΈ°λ³Έμ μΌλ‘ μλμ κ°μ νμ
μ€ν¬λ¦½νΈ μ½λμμμ μ΄κ±°ν μ μ λ° μ κ·Όμ
enum Direction { East, West, South, North } const east: Direction = Direction.East;
μλμ κ°μ μλ°μ€ν¬λ¦½νΈ μ½λλ‘ μ»΄νμΌ λλ€.
var Direction; (function (Direction) { Direction[Direction["East"] = 0] = "East"; Direction[Direction["West"] = 1] = "West"; Direction[Direction["South"] = 2] = "South"; Direction[Direction["North"] = 3] = "North"; })(Direction || (Direction = {})); var east = Direction.East;
μ΄ μ½λλ₯Ό 보면 λ κ°μ§ μΌμ΄ μΌμ΄λκ³ μμμ νμΈν μ μλ€.
- μλ³μμ ν€ β κ°μΌλ‘μ λ§€νμ΄ μ μλλ€. (
Direction["EAST"] = 0
)
- μλ³μμ κ° β ν€λ‘μ μλ°©ν₯ λ§€νμ΄ μ μλλ€. (
Direction[Direction["East"] = 0] = "East"
)
λ¬Έμμ΄ μ΄κ±°νμ κ²½μ° μμ μΈκΈνλλ‘ μλ°©ν₯ λ§€νμ΄ μ‘΄μ¬νμ§ μλλ€. μλμ λ¬Έμμ΄ μ΄κ±°νμ
enum Direction { East = 'EAST', West = 'WEST', South = 'SOUTH', North = 'NORTH' } ---------------Javascript Code----------------- var Direction; (function (Direction) { Direction["East"] = "EAST"; Direction["West"] = "WEST"; Direction["South"] = "SOUTH"; Direction["North"] = "NORTH"; })(Direction || (Direction = {}));
μ»΄νμΌλ μ½λλ‘λΆν° μ΄κ±°ν λ©€λ²μ μ κ·Ό ν λ μ€μ λ‘ μ½λκ° μ€νλ λμλ κ°μ²΄ μμ± μ κ·Όμ΄ λ°μν¨μ μ μ μλ€.
μ΄ μ€λ²ν€λλ λλΆλΆμ κ²½μ° λ¬΄μ κ°λ₯ν μμ€μ΄λ€.
κ·ΈλΌμλ μ±λ₯ ν₯μμ κΎνκ³ μΆλ€λ©΄ const μ΄κ±°νμ μ¬μ©ν μ μλ€.
λͺ¨λ λ©€λ²κ° μ»΄νμΌ μκ°μ μλ €μ§ μμκ°μΈ μ΄κ±°νμ κ²½μ° enum ν€μλ λμ const enum ν€μλλ₯Ό μ΄μ©ν΄ μ μν μ μλ€.
μ΄λ κ² μ μν μ΄κ±°νμ ꡬ쑰λ μ»΄νμΌ κ³Όμ μμ μμ ν μ¬λΌμ§κ³ , λ©€λ²μ κ°μ μμκ°μΌλ‘ λ체λλ€. μλμ μμ λ₯Ό 보μ.
const enum ConstEnum { A, B = 2, C = B * 2, D = -C, } console.log(ConstEnum.A);
μ μ½λλ μλ μλ°μ€ν¬λ¦½νΈ μ½λλ‘ μ»΄νμΌλλ€.
console.log(0 /* A */);
μ£Όμμ μ μΈνκ³ λ μ΄κ±°νμ μλ ꡬ쑰μ λν μ΄λ ν μ 보λ λ¨μμμ§ μκ³ , μμκ°μΌλ‘ λ체λμ΄ μμμ νμΈν μ μλ€.
μ λμ¨ μ΄κ±°ν
μ΄κ±°νμ λͺ¨λ λ©€λ²κ° μλ κ²½μ° μ€ νλμ ν΄λΉνλ μ΄κ±°νμ μ λμ¨ μ΄κ±°ν(union enum)μ΄λΌ λΆλ₯Έλ€.
- μμμ μΌλ‘ μ΄κΈ°ν λ κ° (κ°μ΄ νκΈ°λμ§ μμ)
- λ¬Έμμ΄ λ¦¬ν°λ΄
- μ«μ 리ν°λ΄
μλ₯Ό λ€μ΄ μλ ShapeKind μ΄κ±°νμ μ λμ¨ μ΄κ±°νμ΄λ€.
enum ShapeKind { Circle, Triangle = 3, Square }
μ λμ¨ μ΄κ±°νμ λ©€λ²λ κ°μΈ λμμ νμ
μ΄ λλ€. λ°λΌμ μλ₯Ό λ€μ΄ μλμ κ°μ μ½λλ₯Ό μμ±ν μ μλ€.
type Circle = { kind: ShapeKind.Circle; radius: number; } type Triangle = { kind: ShapeKind.Triangle; maxAngle: number; } type Square = { kind: ShapeKind.Square; maxLength: number; } type Shape = Circle | Triangle | Square;
λν μ»΄νμΌλ¬λ μ λμ¨ μ΄κ±°νμ νΉμ§μΌλ‘λΆν° μ»΄νμΌ νμμ μΆκ°μ μΈ κ²μ¬λ₯Ό μνν μ μλ€.
μ΄μ λν΄μλ μΆν νμ
μ’νκΈ°(type narrowing)μ λν΄ λ€λ£° λ ν¨κ» λ€λ£¬λ€.
μ λμ¨ νμ μ μ΄μ©ν μ΄κ±°ν νν
νμ
μ€ν¬λ¦½νΈλ μ«μ, λ¬Έμμ΄ κ·Έλ¦¬κ³ λΆλ¦¬μΈ κ°μ νμ
μΌλ‘ μ¬μ©νλ 리ν°λ΄ νμ
(literal type)μ μ§μνλ€.
리ν°λ΄ νμ
μ μ΄μ©ν΄ λ¨ νλμ κ°λ§μ κ°λ νμ
μ μ μν μ μλ€.
const answer: 42 = 42; const wrongAnswer: 42 = 24; // error TS2322: Type '24' is not assignable to type '42'.
μ΄ λ 리ν°λ΄ νμ
κ³Ό μ λμ¨ νμ
μ μ‘°ν©ν΄ μ΄κ±°νκ³Ό μ μ¬ν νμ
μ λ§λ€ μ μλ€.
type Direction = 'EAST' | 'WEST' | 'SOUTH' | 'NORTH'; const east: Direction = 'EAST'; const center: Direction = 'CENTER'; // error TS2322: Type '"CENTER"' is not assignable to type 'Direction'.