ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TypeScript] 열거형
    TypeScript 2022. 9. 16. 20:54
    728x90

    TypeScript는 숫자와 문자열을 기반으로 한 열거형을 제공합니다.

    숫자 열거형 (Numeric enums)

    열거형은 enum 키워드를 사용해 정의할 수 있습니다.

    enum Direction1 {
        Up = 1,
        Down,
        Left,
        Right,
    }
    
    enum Direction2 {
        Up,
        Down,
        Left,
        Right,
    }
    
    enum Direction3 {
        Up, // 0
        Down, // 1
        Left=3, // 3
        Right, // 4
    }
    
    enum E {
    		Z, // 0
        A = getSomeValue(),
        B, // 오류! 앞에 나온 A가 계산된 멤버이므로 초기화가 필요합니다.
    }
    
    //열거형에 접근하는 방법
    console.log(Direction3.Right)
    

    Up을 1로 초기화한다면 Down = 2, Left = 3, Right = 4가 되고

    Up을 초기화하지 않는다면 Up = 0, Down = 1, … 이 됩니다.

    이렇게 자동으로 증가하는 기능은 멤버 값 자체에는 신경 쓰지 않지만, 각 값이 같은 열거형의 다른 값과 구별돼야 하는 경우에 매우 유용합니다

    그리고 열거형에는 숫자 상수가 아닌 값이 할당되면 그 다음 값은 초기화돼야 합니다.

    문자열 열거형(String enums)

    숫자형과 유사하지만 런타임에서 동작이 살짝 다릅니다. 문자열 열겨형의 각 멤버는 문자열 리터럴 또는 다른 문자열 열거형의 멤버로 초기화해야 합니다.

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

    자동 증가 기능은 없지만 직렬화를 잘 한다는 이점이 있습니다.

    숫자는 어떤 의미인지 직관적으로 알기 힘들지만, 문자는 직관적으로 알 수 있습니다. 그리고 숫자는 값이 불확실한 경우가 종종 발생할 수 있습니다.

    이종 열거형(Heterogeneous enums)

    숫자와 문자를 섞어서도 사용할 수 있지만 이렇게 사용하 것을 권장하지 않습니다.

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

    계산된 멤버와 상수 멤버(Computed and constant members)

    // E.X는 상수입니다:
    enum E { X } // 0
    
    // 'E1' 과 'E2' 의 모든 열거형 멤버는 상수입니다.
    
    enum E1 { X, Y, Z } // 0, 1, 2
    
    enum E2 {
        A = 1, B, C // 1, 2, 3
    }
    
    • 열거형 멤버는 열거형 표현식으로 초기화됩니다.
      • 리터럴 열거형 표시(문자 or 숫자)
      • 이전에 정의된 다른 상수 열거형 멤버에 대한 참조
      • 괄호로 묶인 상수 열거형 표현식
      • 상수 열거형 표현식에 단항 연산자 +, -. ~를 사용한 경우
      • 상수 열거형 표현식을 이중 연산자 +, -, *, /, %, <<, >>, >>>, &, |, ^의 피연산자로 사용할 경우
      • 상수 열거형 표현식의 값이 NaN 또는 Infinity 면 컴파일 오류가 발생
    enum FileAccess {
        // 상수 멤버
        None, // 0
        Read    = 1 << 1, // 2
        Write   = 1 << 2, // 4
        ReadWrite  = Read | Write, // 6
        // 계산된 멤버
        G = "123".length //  3
    }
    

    유니언 열거형과 열거형 멤버 타임(Union enums and enum member types)

    런타임에서 열거형

    열거형은 런타임에 존재하는 실제 객체입니다. 따라서 아래와 같이 함수로 전달될 수 있습니다.

    enum E {
        X, Y, Z
    }
    function f(obj: { X: number }) {
        return obj.X;
    }
    
    // E가 X라는 숫자 프로퍼티를 가지고 있기 때문에 동작하는 코드입니다.
    f(E);
    

    컴파일 시점에서 열거형(Enums at compile time)

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

    enum LogLevel {
        ERROR, WARN, INFO, DEBUG
    }
    
    /**
     * 이것은 아래와 동일합니다. :
     * 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');
    // Error This is a message 0
    

    역 매핑(Reverse mapping)

    숫자 열거형 멤버는 멤버의 프로퍼티 이름을 가진 객체를 생성하는 것 외에도 열거형 값에서 열거형 이름으로 역 매핑 을 받습니다.

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

    문자열 열거형은 역 매핑을 생성하지 않는다 는 것을 명심하시길 바랍니다.

    const 열거형

    const 열거형은 상수 열거형 표현식만 사용될 수 있으며 일반적인 열거형과 달리 컴파일 과정에서 완전히 제거 됩니다.

    const enum Directions {
        Up,
        Down,
        Left,
        Right
    }
    
    let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
    // 0, 1, 2, 3
    

    Ambient 열거형(Ambient enums)

    이미 존재하는 열거형 타입의 모습을 묘사하기 이ㅜ해 사용됩니다.

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

    참고

    https://typescript-kr.github.io/pages/enums.html#런타임에서-열거형-enums-at-runtime

    728x90

    'TypeScript' 카테고리의 다른 글

    [TypeScript] 고급타입-1  (0) 2022.09.21
    [TypeScript] 제네릭  (0) 2022.09.17
    [TypeScript] 클래스  (0) 2022.09.15
    [TypeScript] 유니언과 교차타입  (1) 2022.09.10
    [TypeScript] 인터페이스  (0) 2022.09.08

    댓글

Designed by Tistory.