티스토리 뷰

 

 

이틀 전부터 타입스크립트를 공부 중인데 any 타입이랑 unknown 타입이 헷갈린다. 둘 다 변수에 어떤 타입의 값이든 할당할 수 있는 것 같아 비슷하게 느껴져, 오늘은 둘의 차이점을 공부해보려 한다.

 

 

any 타입


타입 계층도 (한 입 크기로 잘라먹는 타입스크립트)

 

타입 계층도를 보면 unknonw은 전체 집합이고 any는 치트키 같은 역할이다.

any 타입이 치트키인 이유는 any 타입은 타입스크립트에서만 제공되는 특별한 타입으로 타입 검사를 받지 않기 때문이다.

 

예를 들어 다음과 같이 범용적으로 사용되어야 하는 변수가 있다고 가정해 보자.

let anyVar = 10;
anyVar = "hello"; // 오류 발생!

변수 anyVar는 number 타입의 값 10으로 초기화 되었지만 이후 string 타입의 값 "hello"를 저장해야 한다.

 

타입스크립트에서는 변수의 타입이 변수를 초기화할 때, 초기화 하는 값을 기준으로 추론하기 때문에 위와 같이 작성하면 오류가 발생한다. 따라서 이럴 때는 any 타입을 이용하면 된다.

let anyVar: any = 10;
anyVar = "hello";

anyVar = true;
anyVar = {};

anyVar.toUpperCase();
anyVar.toFixed();
anyVar.a;

이렇듯 any 타입은 어떠한 타입 검사도 받지 않기 때문에 아무 타입의 값이나 범용적으로 담아 사용할 수 있고, 다양한 타입의 메서드도 마음대로 호출해서 사용해도 문제가 되지 않는다.

 

 

 

any의 사용을 자제해야 하는 이유


방금 작성한 코드를 tsx로 실행해보면 런타임 오류가 발생한다. 이렇듯 any 타입은 컴파일 타임에는 오류가 없지만, 런타임에는 오류가 발생할 가능성이 다분하기 때문에 위험하다. 따라서 어쩔 수 없는 경우를 제외하고는 any 타입의 사용을 자제해야 한다.

 

 

unknown 타입


unknown 타입은 any 타입과 비슷하지만 좀 더 안전하다. unknown 타입의 변수는 다음과 같이 어떤 타입의 값이든 다 저장이 가능하다. (이점은 any 타입과 같다)

let unknownVar: unknown;

unknownVar = "";
unknownVar = 1;
unknownVar = () => {};

 

 

그러나 unknown 타입의 값은 어떤 타입의 변수에도 저장할 수 없다.

let num: number = 10;
(...)

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

num = unknownVar; // 오류 !

 

 

또 unknown 타입의 값은 어떤 연산에도 참여할 수 없으며, 어떤 메서드도 사용할 수 없다.

let unknownVar: unknown;
(...)

unknownVar * 2 // 오류!

 

 

정리하자면 unknown 타입은 변수의 타입으로 정의되면 모든 값을 할당받을 수 있지만, unknown 타입의 값은 그 어떤 타입의 변수에도 할당할 수 없고, 모든 연산에 참가할 수 없다.

 

따라서 타입 좁히기를 통해 특정 타입임을 보장할 수 있게 만들어야 사용할 수 있다.

 

 

출처

한 입 크기로 잘라먹는 타입스크립트

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함