본문 바로가기
Typescript

Typescript | Enum, any, unknown

by 리잼 2024. 10. 25.
반응형


열거형 타입 (Enum)

Enum은 JS에 존재하지 않고 오직 TS에서만 사용 가능한 특별한 타입이다

Enum은 다음과 같이 여러개의 값을 나열하는 용도로 사용한다.

// enum 타입
// 여러가지 값들에 각각 이름을 부여해 열거해두고 사용하는 타입

enum Role {
  ADMIN = 0,
  USER = 1,
  GUEST = 2,
}

const user1 = {
  name: "이정환",
  role: Role.ADMIN, //관리자
};

const user2 = {
  name: "홍길동",
  role: Role.USER, // 회원
};

const user3 = {
  name: "아무개",
  role: Role.GUEST, // 게스트
};
  • Enum을 쉽게 말하면 상수라고 볼 수 있다.
  • enum의 값을 변수 값으로도 안전하고 직관적으로 활용할 수 있다.
  • 참고로 enum 멤버에 숫자를 할당하지 않아도 0부터 1씩 자동으로 할당한다
// enum 타입
// 여러가지 값들에 각각 이름을 부여해 열거해두고 사용하는 타입

enum Role {
  ADMIN, // 0 할당(자동)
  USER,  // 1 할당(자동)
  GUEST, // 2 할당(자동)
}

const user1 = {
  name: "이정환",
  role: Role.ADMIN, // 0
};

const user2 = {
  name: "홍길동",
  role: Role.USER, // 1
};

const user3 = {
  name: "아무개",
  role: Role.GUEST, // 2
};
  • 자동으로 할당되는 값은 기본적으로 0이지만 값을 변경하고 싶다면 시작하는 위치에 직접 값을 할당해 주면 된다.
// enum 타입
// 여러가지 값들에 각각 이름을 부여해 열거해두고 사용하는 타입

enum Role {
  ADMIN = 10, // 10 할당 
  USER,       // 11 할당(자동)
  GUEST,      // 12 할당(자동)
}

const user1 = {
  name: "이정환",
  role: Role.ADMIN, // 10
};

const user2 = {
  name: "홍길동",
  role: Role.USER, // 11
};

const user3 = {
  name: "아무개",
  role: Role.GUEST, // 12
};

 

문자열 열거형 

enum 의 멤버에는 문자열 값도 할당이 가능하다.

enum Language {
  korean = "ko",
  english = "en",
}
  • 숫자형 enum과 동일하게 프로퍼티 값으로도 사용할 수있다.
enum Role {
  ADMIN,
  USER,
  GUEST,
}

enum Language {
  korean = "ko",
  english = "en",
}

const user1 = {
  name: "이정환",
  role: Role.ADMIN, // 0
  language: Language.korean,// "ko"
};

any Type

any 타입은 TS에서만 제공되는 특별한 타입으로 타입 검사를 받지 않는 특수한 치트키 타입이다.

  • 예를 들어 다음과 같이 아주 범용적으로 사용되어야 하는 변수가 하나 있다고 가정
let anyVar = 10;
anyVar = "hello"; // 오류 발생!
  • 변수 anyVar는 number 타입의 값 10으로 초기화 했지만 이후에 또 string 타입의 값 “hello”를 저장해야 한다고 가정
  • 타입스크립트에서는 변수의 타입이 변수를 초기화할 때 초기화 하는 값을 기준으로 추론하기 때문에 이렇게 하면 오류가 발생
  • 따라서 이럴 때에는 다음과 같이 any 라는 치트키 타입을 이용하면 된다.
그러나 any 는 최대한 사용하지 말아야한다
let anyVar: any = 10;
anyVar = "hello";

anyVar = true;
anyVar = {};

anyVar.toUpperCase();
anyVar.toFixed();
anyVar.a;
  • 다음과 같은 코드를 컴파일 하거나 ts-node로 실행해보면 런타임 오류가 발생한다.
  • any 타입을 많이 사용하면 TS를 사용하는 이유가 없다.
  • 어쩔 수 없는 경우를 제외하고 any 타입은 사용하지 않는 것이 좋다

Unknown 타입

any 와 비슷하지만 보다 안전한 타입

  • unknwon 타입의 변수는 다음과 같이 어떤 타입의 값이든 저장이 가능
let unknownVar: unknown;

unknownVar = "";
unknownVar = 1;
unknownVar = () => {};
  • 그러나 반대로 어떤 타입의 변수 값에는 저장이 불가능 하다
let num: number = 10;
(...)

let unknownVar: unknown;
unknownVar = "";
unknownVar = 1;
unknownVar = () => {};

num = unknownVar; // 오류 !
  • unknown 타입은 독특하게도 변수의 타입으로 정의되면 모든 값을 할당받을 수 있다.
  • 반대로 unknown 타입의 값은 그 어떤 타입의 변수에도 할당할 수 없고, 모든 연산에 참가할 수 없게 된다.
  • 쉽게 정리하면 오직 값을 저장하는 행위밖에 할 수 없게 된다

만약 위와 같이 unknown 타입의 값을 number 타입의 값처럼 취급하고 곱셈 연산을 수행하게 하고 싶다면
다음과 같이 조건문을 이용해 이 값이 number 타입의 값임을 보장해줘야 한다.

if (typeof unknownVar === "number") {
	// 이 조건이 참이된다면 unknownVar는 number 타입으로 볼 수 있음
  unknownVar * 2;
}

 

반응형