μ΄κ±°νμ μ¬μ©νλ©΄ μ΄λ¦μ΄ μλ μμλ€μ μ μν μ μμ΅λλ€.
μ΄κ±°νμ μ¬μ©μ λ¬Έμμ μλλ λͺ
νν μ¬λ‘λ€μ μ½κ² λ§λ€ μ μμ΅λλ€.
TypeScript λ μ«μ λ° λ¬Έμμ΄ κΈ°λ° μ΄κ±°νμ λͺ¨λ μ 곡ν©λλ€.
λ¨Όμ μ«μ μ΄κ±°νμΌλ‘ μμν©λλ€.
λ€λ₯Έ μΈμ΄μμ μ΄κ±°νμ μ ν΄λ΄€λ€λ©΄ λ μ΅μ ν κ²μ
λλ€.
μ΄κ±°νμ enum
ν€μλλ₯Ό μ¬μ©νμ¬ μ μν μ μμ΅λλ€.
enum Direction {
Up = 1,
Down,
Left,
Right,
}
μμμ Up
λ 1
λ‘ μ΄κΈ°νλ μ«μ μ΄κ±°νμ
λλ€.
μλμ μ΄μ΄μ λ±μ₯νλ λ©€λ²λ€μ μλμΌλ‘ μ¦κ°ν©λλ€.
μ¦, Direction.Up
μ 1
, Down
μ 2
, Left
λ 3
, Right
λ 4
μ
λλ€.
μνλ€λ©΄ μ΄κΈ°νλ₯Ό μμ ν μμ¨ μλ μμ΅λλ€.
enum Direction {
Up,
Down,
Left,
Right,
}
μ¬κΈ°μμλ Up
μ 0
μ΄λ©°, Down
μ 1
μ΄ λ©λλ€.
μ΄ μλ μ¦κ° λμμ λ©€λ²μ κ° μ체μ μ κ²½ μ°μ§ μκ³ κ° μ΄κ±°νμ΄ λμΌν μ΄κ±°νμ λ€λ₯Έ κ°κ³Ό ꡬλ³λλ κ²½μ°μ μ μ©ν©λλ€.
μ΄κ±°νμ μ¬μ©νλ κ²μ κ°λ¨ν©λλ€: μ΄κ±°ν μ체μ μμ±μΌλ‘ λͺ¨λ λ©€λ²μ μμΉμ€νκ³ , μ΄κ±°νμ μ΄λ¦μ μ¬μ©νμ¬ νμ μ μ μΈν©λλ€.
enum Response {
No = 0,
Yes = 1,
}
function respond(recipient: string, message: Response): void {
// ...
}
respond("Princess Caroline", Response.Yes)
μ«μ μ΄κ±°νμ κ³μ°λ, μμ λ©€λ² (computed and constant members)μ νΌν©λ μ μμ΅λλ€.
λ¨νΈμ μΌλ‘ μ΄κΈ°νκ° μλ μ΄κ±°νμ μμ λλ λ€λ₯Έ μμ μ΄κ±°νμ λ©€λ²λ‘ μ΄κΈ°νλ μ«μ μ΄κ±°νμ λ°λΌμΌν νμκ° μμ΅λλ€.
μ¦, λ€μμ νμ©λμ§ μμ΅λλ€:
enum E {
A = getSomeValue(),
B, // μ€λ₯ ! A λ μμλ‘ μ΄κΈ°νλμ§ μμμΌλ―λ‘ Bμλ μ΄κΈ°νκ° νμν©λλ€.
}
λ¬Έμ μ΄κ±°νμ λΉμ·ν κ°λ
μ΄μ§λ§ μλμ μ€λͺ
λ κ²κ³Ό κ°μ΄ μ½κ°μ λ―Έλ¬ν μ€νμ μ°¨μ΄ (runtime differences)κ° μμ΅λλ€.
λ¬Έμ μ΄κ±°νμμ κ° λ©€λ²λ λ¬Έμμ΄ λ¦¬ν°λ΄ λλ λ€λ₯Έ λ¬Έμ μ΄κ±°ν λ©€λ²λ‘ μμμ΄κΈ°νλμ΄μΌ ν©λλ€.
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
λ¬Έμ μ΄κ±°νμ μλ μ¦κ° λμμ νμ§ μμ§λ§ λ¬Έμ μ΄κ±°νμ "μ§λ ¬ν(serialize)"νλ μ΄μ μ΄ μμ΅λλ€.
μ¦, λλ²κΉ
μ€μ΄λ©° μ«μ μ΄κ±°νμ λ°νμ κ°μ μ½μ΄μΌνλ κ²½μ° μ΄ κ°μ μ’
μ’
λΆν¬λͺ
ν©λλ€ - μ¦, μ체μ μΌλ‘ μ μ©ν μλ―Έλ₯Ό μ λ¬νμ§λ μμ΅λλ€.(μ 맀ν (enums-at-runtime)μ΄ λμμ΄ λ κ²μ
λλ€)
λ¬Έμ μ΄κ±°νμ μ¬μ©νλ©΄ μ΄κ±°ν λ©€λ² μ체μ μ΄λ¦κ³Ό λ
립μ μΌλ‘ μ½λκ° μ€νλ λ μλ―Έμκ³ μ½κΈ° μ¬μ΄ κ°μ μ 곡ν©λλ€.
μλ°ν λ§νμλ©΄ μ΄κ±°νμ λ¬Έμμ΄κ³Ό μ«μ λ©€λ²μ μμΌ μλ μμ§λ§ κ·Έλ κ² ν μ΄μ λ μμ΅λλ€.
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
}
JavaScriptμ λ°νμ λμμ μ€μ λ‘ μ¬μ©νλ €κ³ νμ§ μλ ν, μ΄λ κ² νμ§ μλ κ²μ΄ μ’μ΅λλ€.
κ° μ΄κ±°ν λ©€λ²μλ constant λλ computed μ€ νλμΌ μ μλ κ°μ΄ μμ΅λλ€.
μ΄κ±°ν λ©€λ²λ λ€μκ³Ό κ°μ κ²½μ° μμλ‘ κ°μ£Όλ©λλ€:
-
μ΄κ±°νμ 첫 λ²μ§Έ λ©€λ²μ΄λ©° μ΄κΈ°νκ° μμΌλ©΄ κ°μ΄
0
μΌλ‘ μ§μ λ©λλ€:// E.X λ μμμ λλ€: enum E { X }
-
μ΄κΈ°νκ° μκ³ μμ μ΄κ±°ν λ©€λ²κ° μ«μ μΈ μμμ λλ€.
μ΄ κ²½μ° μ΄ν λμ€λ μ΄κ±°ν λ©€λ²μ κ°μ μ΄μ μ΄κ±°ν λ©€λ²μ κ°μ 1μ λν κ°μ΄ λ©λλ€.// E1 λ° E2μ λͺ¨λ μ΄κ±°ν λ©€λ²λ μμμ λλ€. enum E1 { X, Y, Z } enum E2 { A = 1, B, C }
-
μ΄κ±°ν λ©€λ²λ μμ μ΄κ±°ν ννμμΌλ‘ μ΄κΈ°νλ©λλ€.
μμ μ΄κ±°ν ννμμ μ»΄νμΌ μκ°μ μμ ν νκ°λ μ μλ TypeScriptμ νμ μ§ν©μ λλ€.
ννμμ λ€μκ³Ό κ°μ κ²½μ° μμ μ΄κ±° ννμμ λλ€:- 리ν°λ΄ μ΄κ±° ννμ (κΈ°λ³Έμ μΌλ‘ λ¬Έμ 리ν°λ΄ λλ μ«μ 리ν°λ΄)
- μ΄μ μ μ μλ μμ μ΄κ±°ν λ©€λ² (λ€λ₯Έ μ΄κ±°νμμ μ¬ μ μμ)μ λν μ°Έμ‘°
- κ΄νΈλ‘ λ¬ΆμΈ μμ μ΄κ±°ν ννμ
- μμ μ΄κ±°ν ννμμ μ μ©λ
+
,-
,~
λ¨ν μ°μ°μ μ€ νλ +
,-
,*
,/
,%
,<<
,>>
,>>>
,&
,|
,^
λ°μ΄λ리 μ°μ°μμ μ¬μ©λ μμ μ΄κ±°ν ννμ μμ μ΄κ±°ν ννμμ΄NaN
λλInfinity
λ‘ νκ°λλ κ²μ μ»΄νμΌ νμ μλ¬μ λλ€.
λ€λ₯Έ λͺ¨λ κ²½μ°μλ μ΄κ±°ν λ©€λ²κ° κ³μ°λ(computed) κ²μΌλ‘ κ°μ£Όλ©λλ€.
enum FileAccess {
// μμ λ©€λ²
None,
Read = 1 << 1,
Write = 1 << 2,
ReadWrite = Read | Write,
// κ³μ°λ λ©€λ²
G = "123".length
}
κ³μ°λμ§ μμ μμ μ΄κ±°ν λ©€λ²μ νΉμ νμ μ§ν©μ΄ μμ΅λλ€: 리ν°λ΄ μ΄κ±°ν λ©€λ²μ
λλ€.
리ν°λ΄ μ΄κ±°ν λ©€λ²λ μ΄κΈ°νλ κ°μ΄ μκ±°λ λ€μ κ°μΌλ‘ μ΄κΈ°ν λ κ°μ΄ μλ μμ μ΄κ±°ν λ©€λ²μ
λλ€.
- λ¬Έμμ΄ λ¦¬ν°λ΄ (μ:
"foo"
,"bar"
,"baz"
) - μ«μ 리ν°λ΄ (μ:
1
,100
) - μ«μ 리ν°λ΄μ μ μ©λλ λ¨ν λ§μ΄λμ€ (μ:
-1
,-100
)
μ΄κ±°νμ λͺ¨λ λ©€λ²κ° 리ν°λ΄ μ΄κ±°ν κ°μ κ°μ§ λ μΌλΆ νΉμν μλ―Έκ° μμ΅λλ€.
첫λ²μ§Έλ μ΄κ±°ν λ©€λ²λ νμ μ΄ λλ€λ κ²μ λλ€. μλ₯Ό λ€μ΄ νΉμ λ©€λ²λ μ΄κ±°ν λ©€λ²μ κ°λ§ κ°μ§ μ μμ΅λλ€.
enum ShapeKind {
Circle,
Square,
}
interface Circle {
kind: ShapeKind.Circle;
radius: number;
}
interface Square {
kind: ShapeKind.Square;
sideLength: number;
}
let c: Circle = {
kind: ShapeKind.Square,
// ~~~~~~~~~~~~~~~~ μ€λ₯!
radius: 100,
}
λ λ€λ₯Έ λ³νλ μ΄κ±° νμ
μμ²΄κ° κ° μ΄κ±°ν λ©€λ²μ ν©μ§ν©(union) μ΄ λλ€λ κ²μ
λλ€.
[κ²°ν© νμ
(union types)](./Advanced Types.md#union-types)μ λν΄ μμ§ λ°°μ°μ§ μμμ§λ§, μμ λμ΄μΌ ν κ²μ μ‘°ν© μ΄κ±°νμ μ¬μ©νλ νμ
μμ€ν
μ΄ μ΄κ±°ν μ체μ μ‘΄μ¬νλ μ νν κ°λ€μ μκ³ μλ€λ μ¬μ€μ νμ©ν μ μλ€λ κ²μ
λλ€.
μ΄ λλ¬Έμ TypeScriptλ κ°μ μλͺ» λΉκ΅νλ λ°λ³΄κ°μ λ²κ·Έλ₯Ό μ‘μ μ μμ΅λλ€.
enum E {
Foo,
Bar,
}
function f(x: E) {
if (x !== E.Foo || x !== E.Bar) {
// ~~~~~~~~~~~
// μ€λ₯! μ°μ°μ '!==' λ 'E.Foo' λ° 'E.Bar' νμ
μ μ μ©ν μ μμ΅λλ€.
}
}
μ΄ μμ μμ, λ¨Όμ x
κ° E.Foo
κ° κ° μλμ§ κ²μ¬νμ΅λλ€.
μ΄ κ²μ¬λ₯Ό μ±κ³΅νλ©΄ ||
κ° μ€νλμ§ μκ³ 'if' μ λ΄λΆκ° μ€νλ©λλ€.
νμ§λ§ κ²μ¬λ₯Ό μ±κ³΅νμ§ λͺ»νλ©΄ x
λ μ€μ§ E.Foo
λ§ λ μ μμ΅λλ€. λ°λΌμ E.Bar
μ λμΌν μ§ νμΈνλ κ²μ μλ―Έκ° μμ΅λλ€.
μ΄κ±°νμ λ°νμμ μ‘΄μ¬νλ μ€μ κ°μ²΄μ λλ€.
μλ₯Ό λ€μ΄ λ€μ μ΄κ±°νμ 보면,
enum E {
X, Y, Z
}
μ€μ λ‘ ν¨μμ μ λ¬ λ μ μμ΅λλ€.
function f(obj: { X: number }) {
return obj.X;
}
// μλν©λλ€. μλνλ©΄ `E` λ μ«μμΈ `X` λΌλ μμ±μ κ°μ§κ³ μκΈ° λλ¬Έμ
λλ€.
f(E);
λ©€λ²μ λν μμ± μ΄λ¦μ΄ μλ κ°μ²΄λ₯Ό λ§λλ κ² μΈμλ μ«μ μ΄κ±°ν λ©€λ²λ μ΄κ±°ν κ°μμ μ΄κ±°νμ μ΄λ¦μΌλ‘ μ 맀ν(reverse mapping) μ λ°μ΅λλ€.
μλ₯Ό λ€μ΄, λ€μ μμ μμ:
enum Enum {
A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"
TypeScriptλ μ΄κ²μ λ€μ JavaScriptλ‘ μ»΄νμΌν©λλ€.
var Enum;
(function (Enum) {
Enum[Enum["A"] = 0] = "A";
})(Enum || (Enum = {}));
var a = Enum.A;
var nameOfA = Enum[a]; // "A"
μ΄ μμ±λ μ½λμμ μ΄κ±°νμ μ λ°©ν₯(forward) (name
-> value
) 맀νκ³Ό μλ°©ν₯(reverse) (value
-> name
) 맀νμ λͺ¨λ μ μ₯νλ κ°μ²΄λ‘ μ»΄νμΌλ©λλ€.
λ€λ₯Έ μ΄κ±°ν λ©€λ²μ λν μ°Έμ‘°λ νμ μμ± μ κ·ΌμΌλ‘ λ°©μΆλλ©° κ²°κ³ μΈλΌμΈ(inline)λμ§ μμ΅λλ€.
λ¬Έμμ΄ μ΄κ±°ν λ©€λ²λ μ맀νμ μμ±νμ§ μμ΅λλ€.
λλΆλΆμ κ²½μ° μ΄κ±°νμ μλ²½νκ² μ ν¨ν λ°©λ²μ
λλ€.
νμ§λ§ λλλ‘ μꡬμ¬νμ΄ λ μ격ν©λλ€.
μ΄κ±°νμ κ°μ μ κ·Όν λ μ¬λΆλμ΄ μμ±λ μ½λμ μΆκ°μ μΈ μ°ν λΉμ©μ νΌνλ €λ©΄ const
μ΄κ±°νμ μ¬μ© ν μ μμ΅λλ€.
const
μ΄κ±°νμ μ΄κ±°νμ const
μ§μμλ₯Ό μ¬μ©νμ¬ μ μν©λλ€.
const enum Enum {
A = 1,
B = A * 2
}
const
μ΄κ±°νμ μμ μ΄κ±°ν ννμλ§ μ¬μ©ν μ μμΌλ©° μΌλ° μ΄κ±°νκ³Ό λ¬λ¦¬ μ»΄νμΌνλ λμ μμ ν μ κ±°λ©λλ€.
const
μ΄κ±°ν λ©€λ²λ μ¬μ©νλ μ¬μ΄νΈμμ μΈλΌμΈ(inline)λ©λλ€.
const
μ΄κ±°νμ κ³μ°λ λ©€λ²λ₯Ό κ°μ§μ μκΈ° λλ¬Έμ κ°λ₯ν©λλ€.
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
μ½λλ λ€μκ³Ό κ°μ΄ μ»΄νμΌ λ©λλ€.
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
declare enum Enum {
A = 1,
B,
C = 2
}
μ°λΉμΈνΈ μ΄κ±°νκ³Ό λΉμ°λΉμΈνΈ μ΄κ±°νμ μ€μν μ°¨μ΄μ μ€ νλλ μΌλ° μ΄κ±°νμμ μ΄κΈ°νκ° μλ λ©€λ²λ μ΄μ μ΄κ±°ν λ©€λ²κ° μμλ‘ κ°μ£Όλλ€λ κ²μ
λλ€.
λ°λλ‘, μ΄κΈ°νκ° μλ μ°λΉμΈνΈ (κ·Έλ¦¬κ³ λΉμμ(non-const
)) μ΄κ±°ν λ©€λ²λ νμ κ³μ°λ κ²μΌλ‘ κ°μ£Όλ©λλ€.