사용자 도구

사이트 도구


typescript:enum

문서의 이전 판입니다!


Enums

Aspects to enums

lookup object

tsc

enum Zoo { Cat, Tiger }

위의 코드를

var Zoo;
(function (Zoo){
  Zoo[Zoo["Cat"] = 0] = "Cat";
  Zoo[Zoo["Tiger"] = 1] = "Tiger";
)(Zoo || (Zoo{}))

로 변경한다.

lookup object를 참조한다고 할 수 있다. 이것의 목적은 두 가지입니다 : 문자열에서 숫자로의 매핑 역할을하는 것. Zoo.Cat 또는 Zoo[ 'Cat']를 쓸 때, 숫자에서 문자열로의 매핑 역할을 합니다. 역 매핑은 디버깅 또는 로깅 목적에 유용합니다. 종종 0 또는 1 값을 가지며 해당 문자열 “Cat”또는 “Tiger”를 가져옮니다.

declare or ambient

TypeScript에서는 컴파일러가 알아야 할 사항을 “선언”할 수 있지만 실제로 코드를 생성 되지는 않습니다. 이는 유형 정보가 필요하지만 컴파일러에서 생성된 코드가 필요없는 일부 객체 (예 : $)를 정의하는 jQuery와 같은 라이브러리가있는 경우에 유용합니다. 명세와 다른 문서는 이런 식으로 된 선언을 “앰비언트 (Ambient)“문맥에 있는 것으로 언급한다; .dts 파일의 모든 선언은 “앰비언트”(명시적 선언 수정자를 필요로하거나 선언 유형에 따라 암시적으로 지정하는 것)이 중요합니다.

inlining

성능 및 코드 크기 때문에 컴파일 할 때 열거 형 멤버에 대한 참조를 숫자로 대체하는 것이 바람직합니다.

enum Foo { X = 4 }
var y = Foo.X; // emits "var y = 4";

spec은 이 대체를 호출합니다. 개인적으로 소리가 좋기때문에 “inlining”으로 명명하겠다. 때때로 열거형 값이 향후 API 버전에서 변경 될 수 있기 때문에 열거형 멤버가 인라인되지 않게하려는 경우가 있습니다.

Enums, how do they work?

열거 형의 각 측면별로 이것을 분해 해 봅시다. 불행히도이 네 섹션은 다른 모든 섹션의 용어를 참조 할 것 이므로 이 모든 것을 두 번 이상 읽어야합니다.

computed vs non-computed (constant)

Enum 멤버는 계산됨 이거나 아니거나다. 스펙은 비계산 멤버는 constant라 명명한다, 그러나 const와 충돌을 회피하기 위해서 non-computed라 부르겠다.

Enums

enum을 사용하면 이름이 부여된 상수 집합을 정의할 수 있다.

enum Direction { Up=1, Down, Left, Right }
// Direction.Up은 값 1, Down은 2, Left는 3, Rright는 4를 가진다.
// 1로 초기화되고, 모든 후속멤버는 자동증가한다.
enum E {
  A = getSomeValue(),
  B, // error! 'A' is not constant-initialized, so 'B' needs an initializer
}

String enums

enum Direction {
    Up = "UP",
    Down = "DOWN",
    Left = "LEFT",
    Right = "RIGHT",
}

Heterogeneous enums

이론적으로는 가능하지만 어떤 필요성이 있는지는 의문

enum BooleanLikeHeterogenousEnum {
  No = 0,
  Yes = "YES",
}

Computed and constant members

각 enum 멤버는 상수 또는 계산됨 중 하나의 값을 가진다.

멤버가 상수로 간주되는 경우

  • 초기화가 없는 첫번째 멤버( 0으로 대응 )
  • 초기화가 없고 앞의 멤버가 numeric constant인 경우.( +1을 한 값이 된다 )
  • constant enum expression으로 초기화된 경우.

    constant enum expression은 compile time에 모두 계산 가능한 TypeScript 수식의 부분집합이다.

    1. 리터럴 enum 표현식 (기본적으로 문자열 리터럴 또는 숫자 리터럴)
    2. 이전에 정의 된 상수 열거 형 멤버 (다른 열거 형에서 비롯 될 수 있음)에 대한 참조
    3. 괄호 안의 constant enum expression
    4. 상수 열거 표현식에 적용된 +, -, ~ 단항 연산자 중 하나
    5. 피연산자로 상수 enum 표현식이있는 이진 연산자 +, -, *, /, %, «, », »>, &,

constant enum expression이 NaN 또는 Infinity로 평가되는 것은 컴파일 타임 오류입니다.

다른 경우의 모든 enum 멤버는 computed로 간주됩니다.

enum FileAccess {
    // constant members
    None,
    Read    = 1 << 1,
    Write   = 1 << 2,
    ReadWrite  = Read | Write,
    // computed member
    G = "123".length
}

Enums at runtime

Enums는 런타임에 존재하는 실제 객체이다.

enum E {
  X, Y, Z
}
 
function f(obj: { X: number }) {
  return obj.X;
}
 
// Works, since 'E' has a property named 'X' which is a number.
f(E); // enum은 함수에 매개변수로 전달될 수 있다.

Enums at compile time

Enums은 런타임에 존재하는 실제 객체이지만 keyof 키워드는 일반적인 객체에서 기대하는 것과 다르게 작동합니다. 대신 keyof typeof를 사용하여 모든 Enum 키를 문자열로 나타내는 Type을 가져옵니다.

enum LogLevel {
    ERROR, WARN, INFO, DEBUG
}
 
/**
 * This is equivalent to:
 * type LogLevelStrings = 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
 */
type LogLevelStrings = keyof typeof LogLevel;
 
function printImportant(key: LogLevelStrings, message: string) {
    const num = LogLevel[key];
    if (num <= LogLevel.WARN) {
       console.log('Log level key is: ', key);
       console.log('Log level value is: ', num);
       console.log('Log level message is: ', message);
    }
}
printImportant('ERROR', 'This is a message');

Reverse mappings

numeric enums 멤버는 구성원에 대한 속성 이름이있는 개체를 만드는 것 외에도 enum 값에서 enum 이름으로 역매핑을 가져옵니다.

enum Enum {
  A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"

string enums 멤버는 역 매핑을 전혀 생성하지 않는다는 것을 명심하라

const enum

대부분의 경우 열거 형은 완벽하게 유효한 솔루션입니다. 그러나 때로는 요구 사항이 더 엄격합니다. enum 값에 액세스 할 때 여분의 생성 된 코드 및 추가 indirection의 비용을 지불하지 않으려면 const 열거 형을 사용할 수 있습니다. Const enum은 enum의 const 수정자를 사용하여 정의됩니다.

const enum Enum {
  A = 1,
  B = A * 2
}

Const enum은 상수 enum 표현식 만 사용할 수 있으며 일반 enum과 달리 컴파일하는 동안 완전히 제거됩니다. Const enum 멤버는 사용되는 곳에 인라인됩니다. const 열거 형은 computed 멤버를 가질 수 없기 때문에 가능합니다.

let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
 
// 이것은 다음과 같은 코드로 생성된다.
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

Ambient enums

앰비언트 열거 형은 이미 존재하는 열거 형의 모양을 설명하는 데 사용됩니다.

declare enum Enum {
    A = 1,
    B,
    C = 2
}

ambient 과 non-ambient enums의 중요한 차이점 중 하나는 일반 enum에서는 초기화가 없는 멤버는 이전 enum 멤버가 constant로 간주되는 경우 constant로 간주된다는 것입니다. 대조적으로, 초기화가 없는 ambient(및 non-const) enum 멤버는 항상 **computed”로 간주됩니다.

typescript/enum.1564364821.txt.gz · 마지막으로 수정됨: 2025/04/15 10:05 (바깥 편집)