본문 바로가기
카테고리 없음

TypeScript Enum, Any, Never, Type Assertions 정리

by mtoc 2020. 4. 15.

이 글은 TypeScript 홈페이지(https://www.typescriptlang.org/docs/handbook/basic-types.html)을 바탕으로 작성되었다.

더 자세한 내용을 원한다면 위 링크로!

Enum

찾아보니 자바스크립트(ES6 기준)에서는 Enum이라는 데이터타입 자체를 따로 제공하지는 않는 듯했다.

타입스크립트에서는 Enum이라는 변수 타입을 제공하고 그에 대해서 설명하고 있다.

enum은 숫자값에 대해 이름을 정의하는 방법이다.

enum Color {Red, Green, Blue}
let c: Color = Color.Green;

이 코드를 enum.ts 파일을 만들고 입력한다음 tsc enum.ts로 실행시키고 enum.js를 확인해보면

var Color;
(function (Color) {
    Color[Color["Red"] = 0] = "Red";
    Color[Color["Green"] = 1] = "Green";
    Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}));
var c = Color.Green;

기본적으로 enum은 원소를 0부터 세는데 처음에 시작하는 숫자를 바꾸는 방법은 간단하다.

enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;

코드를 바꾸고 저장한 다음 실행시키면

var Color;
(function (Color) {
    Color[Color["Red"] = 1] = "Red";
    Color[Color["Green"] = 2] = "Green";
    Color[Color["Blue"] = 3] = "Blue";
})(Color || (Color = {}));
var c = Color.Green;

Red = 1로 해줬더니 Green, Blue에도 자동적으로 각각 2, 3이 할당되어 있는 것을 볼 수 있다.

이런 식으로 각각의 원소에 수동적으로(manually) 값을 설정할 수 있다.

enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];

Color[2]는 []안의 값과 일치하는 enum 원소의 이름을 반환한다.

Any

알지 못하는 변수의 타입을 설명해야 할 때가 있다. 이러한 값들은 동적인 컨텐츠인 서드 파티 라이브러리에서 발생하며 이 경우 암묵적으로 타입을 확인하고 컴파일할 때 값을 넘겨주게 될 것이다. any는 이런 타입을 명시할 때 쓴다.

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false

any 타입의 역할이 Object와 겹친다고 생각할 수도 있지만 Object는 값을 할당할 수 있을 뿐 실제로 메소드가 존재하더라도 호출할 수 없다.

let notSure: any = 4;
notSure.ifItExists();
notSure.toFixed();

let prettySure: Object = 4;
prettySure.toFixed();

위 코드를 입력하고 실행시키면 오브젝트 타입에는 해당 프로퍼티가 없다는 에러가 뜬다.

any 타입은 일부 타입을 알고 있지만 모든 타입은 알지 못할 때 쓴다.

let list: any[] = [1, true, "free"];

list[1] = 100;

Never

never 타입은 절대 만들어지지 않을 값의 타입을 나타낼 때 쓴다. 항상 예외를 잡아내거나 반환하지 않는 함수(계속해서 loop 돌면서 메모리 초과 일으키는 함수를 말하는 듯)에 쓰는 타입이다. 절대 true가 될 수 없는 변수에도 never 타입을 적용한다.

never는 모든 타입에 할당할 수 있으며 모든 타입의 하위타입이지만 never에 할당할 수 있는 타입은 없으며 never의 하위 타입 또한 존재하지 않는다. never만이 never에 할당될 수 있으며 never의 하위 타입이다. anynever에 할당될 수 없다.

// never를 리턴하는 함수는 분명 도달할 수 없는 엔드 포인트를 가질 것임
function error(message: string): never {
    throw new Error(message);
}

// never를 리턴할 것으로 예상됨
function fail() {
    return error("Something failed");
}

// never를 리턴하는 함수는 분명 무한루프를 돌 것임
function infiniteLoop(): never {
    while (true) {
    }
}

Type Assertions

Type assertions(타입 명시)는 컴파일러에게 내가 뭘 하고 있는지 알고 있다는 신호를 보내는 방법이다. 타입 명시는 따로 타입을 체크하거나 데이터를 재구조하지 않는다.

// angle-bracket syntax
let someValue: any = "this is a string";

let strLength: number = (<string>someValue).length;

// as syntax
let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

자바스크립트로 변환된 코드는 다음과 같다.

var someValue = "this is a string";
var strLength = someValue.length;

댓글