본문 바로가기
웹 프로그래밍/JavaScript | TypeScript

[한 입 크기로 잘라먹는 TypeScript] CH2. 타입스크립트 기본 3(6.any와 unknown, 7.void와 never)

by 청량리 물냉면 2024. 4. 11.
반응형

chapter 2. 타입스크립트 기본

6. any와 unknown

✅ any 타입

  • 타입스크립트에서만 제공되는 특별한 타입
  • 타입검사를 받지 않은 특수 타입
let anyVar: any = 10;
anyVar = "hello";

anyVar = true;
anyVar = {};

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

어떠한 타입 검사도 받지 않으므로 아무 타입의 값이나 범용적으로 담아 사용 가능하며 다양한 타입의 메서드를 마음대로 호출해도 문제가 되지 않는다.

any 타입은 모든 타입스크립트의 문법과 규칙으로부터 자유롭지만, 타입 검사가 이뤄지지 않기 때문에 코드 오류가 발생할 여지가 크다.

따라서 *특수한 경우를 제외하고는 any 타입 사용은 권장되지 않는다.

 

*특수한 경우의 예

  1. 외부 라이브러리와의 상호작용: 외부 라이브러리에서 제공하는 타입을 사용할 수 없거나, 해당 타입이 너무 복잡하여 직접 정의하기 어려운 경우에 any를 사용하여 해당 값을 수용할 수 있다.
  2. 타입스크립트의 타입 시스템 한계: 타입스크립트의 타입 시스템은 모든 상황을 완벽하게 처리할 수는 없다. 때로는 복잡한 상황에서 타입을 정확하게 유추할 수 없는 경우가 발생할 수 있는데, 이때 any를 사용한다.

✅ Unknown 타입

  • any 타입과 비슷하지만 보다 안전한 타입
  • Unknown 타입의 변수는 어떤 타입의 값이든 모두 저장할 수 있다.
  • 하지만 Unknown 타입의 값은 어떤 타입의 변수에도 저장할 수 없다.
  • Unknown 타입의 값은 어떤 연산에도 참여할 수 없고 어떠한 메서드도 사용할 수 없다.
  • 👉 오직 값을 저장하는 행위밖에 할 수 없는 타입
// Unknown 타입의 값 저장
let unknownVar: unknown; //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 타입의 값을 number 타입의 값처럼 취급하고 곱셈 연산을 수행하게 하고 싶다면 다음과 같이 조건문을 이용해 이 값이 number 타입의 값임을 보장해 주어야 한다. 

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

위 코드처럼 조건문을 이용해 특정 값이 특정 타입임을 보장할 수 있게 되면 해당 값의 타입이 자동으로 바뀐다.(=타입 좁히기)

따라서 특정 변수가 당장 어떤 값을 받게 될지 모른다면 any 타입보다 unknown 타입을 사용하는 것이 안전하다.

 

 

7. void와 never

✅ void

  • 아무런 값도 없음을 의미하는 타입
  • 아무런 값도 반환하지 않는 함수의 반환값 타입을 정의할 때 사용
function func2(): void {
  console.log("hello");
}

 

변수의 타입으로도 void 타입을 지정할 수 있다.

let a: void;
a = undefined;

하지만 void 타입의 변수에는 undefined 이외의 다른 타입의 값은 담을 수 없다. 

👉 void 타입이 undefined 타입을 포함하는 타입이기 때문

 

그러나 예외적으로, `tsconfig.json`의 엄격한 null 검사(strictNullChecks) 옵션을 해제(False)로 설정하면 이때는 void 타입의 변수에 null 값도 담을 수 있게 된다.

// "strictNullChecks: false" 일 경우
let a: void;
a = undefined;
a = null;

 

✅ never 타입

  • 불가능을 의미하는 타입
  • 함수가 어떠한 값도 반환할 수 없는 상황일 때 해당 하수의 반환값 타입을 정의할 때 사용된다.
function func3(): never {
  while (true) {}
}

위의 함수 func3은 무한 루프를 돌기 때문에 아무런 값도 반환할 수 없다.

영원히 종료될 수 없는 함수이므로 뭔가를 반환하는 것이 불가능하다. 

이처럼 불가능한 값의 타입을 정의할 때 never 타입을 사용한다.

 

무한 루프 외에도 의도적으로 오류를 발생시키는 함수 역시 never 타입으로 반환값 타입을 정의할 수 있다.

function func4(): never {
  throw new Error();
}

 

변수의 타입을 never로 정의할 시, any를 포함해 그 어떠한 타입의 값도 이 변수에 담을 수 없게 된다.

let anyVar: any;

let a: never;
a = 1;	//❌
a = null;	//❌
a = undefined;	//❌
a = anyVar;	//❌

 

 


출처

 

한 입 크기로 잘라먹는 타입스크립트(TypeScript) | 이정환 Winterlood - 인프런

이정환 Winterlood | 문법을 넘어 동작 원리와 개념 이해까지 배워도 배워도 헷갈리는 타입스크립트 이제 제대로 배워보세요! 여러분을 타입스크립트 마법사🧙🏻‍♀️로 만들어드립니다., 프론

www.inflearn.com

 

 

반응형