Skip to content

Latest commit

 

History

History
150 lines (95 loc) · 3.89 KB

File metadata and controls

150 lines (95 loc) · 3.89 KB

6. any와 unknown

any 타입

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


ex. 다음과 같이 아주 범용적으로 사용되어야 하는 변수가 하나 있다고 가정

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

→ anyVar는 number 타입의 값 10으로 초기화 했지만 이후에 string 타입을 저장하고 있음


TS에서는 변수의 타입이 변수를 초기화할 때 초기화 하는 값을 기준으로 추론하기 때문에 이렇게하면 오류가 발생…

따라서 이럴 때 any라는 치트키 타입을 이용하면 됨

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

anyVar = true;
anyVar = {};

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

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


또 any 타입의 값은 어떤 타입으로 정의된 변수던 문제 없이 다 할당할 수 있음. 따라서 다음과 같이 number 타입의 변수 num에 any 타입의 값 anyVar를 할당해도 문제가 되지 않음

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

let num: number = 10;
num = anyVar;

any는 최대한 사용하지 마세요

아까 작성한 코드를 컴파일하거나 ts-node로 실행해보면 런타임 오류가 발생…

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

anyVar = true;
anyVar = {};

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

→ any타입은 타입 검사를 받지 않는 타입이 되기에 모든 TS의 문법과 규칙으로 자유롭지만 위험함


따라서 any 타입을 많이 사용하면 많은 부분에서 타입 검사가 제대로 이루어지지 않기 때문에 위험한 코드가 생산됨. 이럴꺼면 TS 쓰지마…


따라서 정말 어쩔 수 없는 경우 빼고는 any를 사용하지 않는 것을 권장


Unknown 타입


unknown 타입은 any 타입과 비슷하지만 보다 안전한 타입

unknown 타입의 변수는 다음과 같이 어떤 타입의 값이든 다 저장할 수 있음

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 타입의 값은 그 어떤 타입의 변수에도 할당할 수 없고, 모든 연산에 참가할 수 없게 됨
  • → 쉽게 정리하면 오직 값을 저장하는 행위밖에 할 수 없게 됨

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

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

참고로 TS에서는 위 코드처럼 조건문을 이용해 특정 값이 특정 타입임을 보장할 수 있게 되면 해당 값의 타입이 자동으로 바뀜 → 타입 좁히기


따라서 특정 변수가 당장 어떤 값을 받게 될 지 모른다면 any 타입으로 정의하는 것 보다는 unknown 타입을 이용하는게 훨씬 안전한 선택이 됨