[Typescript] any, unknown, void, never

Bam·2023년 8월 19일
0

Typescript

목록 보기
12/32
post-thumbnail

enum에 이어서 타입스크립트에서만 지원하는 특수 타입인 any, unknown, void, never에 대해 소개해보려고 합니다.


any

any타입 검사를 따로 수행하지 않는 타입입니다. 존재이유는 기존 자바스크립트와 타입스크립트 간의 호환을 위해서라고 할 수 있습니다.

기존의 자바스크립트 처럼 하나의 변수에 여러 타입 데이터가 할당되었다 해제되었다 할 때 이용하게 됩니다.

let anyVariable: any = 'typescript';
anyVariable = 1;
anyVariable = true;

...이렇게 보면 귀에 걸면 귀걸이 코에 걸면 코걸이같은 만능 타입 처럼 보이지만 사실은 사용을 최대한 자제하는게 맞습니다.

타입스크립트의 사용 목적중 하나가 타입 검사를 통해 사전에 오류를 방지하고, 유지보수 생산성을 크게 올리는 것인데 여기서 타입 검사를 건너뛰게 된다면 타입스크립트를 사용하는 이유가 전혀 없기에 any타입의 무분별한 사용은 당연히 자제해야합니다.


unknown

unknown타입은 상당히 독특한 타입으로, 값을 저장하기만 하는 타입입니다. 이때 저장되는 값은 any타입과 마찬가지로 어떤 타입이든 상관없이 값이 저장됩니다.

let unknownVariable: unknown = 'typescript;
unknownVariable = 1;
unknownVariable = true;

unknown 타입의 값은 다른 변수의 값으로 저장될 수 없다는 특징을 갖고 있습니다.

let str: string = '';
let unknownVariable: unknown = 'typescript;

str = unknownVariable; //Error!!!

또 다른 특징으로 unknown 타입은 연산, 메소드의 사용이 불가능합니다.

let unknownVariable: unknown = 'typescript;
unknownVariable = 1;
unknownVariable += 100; //Error!!

그래서 보통 다음과 같이 조건문에서 unknown타입에 저장된 값이 특정 타입임을 검증하고 사용합니다.

let unknownVariable: unknown = 'typescript;

if (typeof unknownVariable === 'string') {
  unknownVariable + ' is funny';
}

방금 전에 unknown 타입은 어떤 연산에도 참여할 수 없다고 했습니다. 하지만 타입스크립트에서는 조건문을 통해 특정 값이 특정 타입이라고 보장하게 된다면 그때 부터 타입이 보장된 타입으로 자동적으로 변경됩니다.

let unknownVariable: unknown = 'typescript;

if (typeof unknownVariable === 'string') {
  //통과하면 unknownVariable에 저장된 값은 string 타입이다.
  //그러므로 조건문을 통과하면 unknownVariable이 string 타입으로 변화.
  unknownVariable + ' is funny'; //조건문 통과 이후엔 연산이나 메소드의 사용이 가능!
}

이러한 동작을 Type Narrowing(타입 좁히기)라고 하는데, 이 부분은 추후에 추가적으로 다루겠습니다.


void

void는 말 그대로 비었다, 아무것도 없음을 의미하는 타입입니다.

보통은 반환값이 없는 함수에서 반환값 타입을 지정할 때 사용합니다.

const func = (): void => {
  console.log('typescript');
};

참고로 타입스크립트에서 함수 선언은 다음과 같이 합니다. 이 역시도 추후에 다룰예정입니다.

//function 명령
function 함수명(인자: 타입): 반환값_타입 {}

//ES6 애로우 함수
const 함수명 = (인자: 타입): 반환값_타입 => {};

일반적으로는 함수에 사용하지만 변수에도 void타입을 사용할 수 있습니다. 이때 변수의 값으로는 undefined만 올 수 있습니다.

let voidVariable: void = undefined; //이 외의 타입 값이 오면 Error

never

never타입도 이름처럼 절대 불가능을 의미합니다.

never타입은 함수가 어떠한 값도 반환할 수 없는 함수의 반환값 타입으로 사용합니다.

이런 경우가 도대체 뭐가 있나 봤더니 함수 내에서 무한 루프를 사용하는 경우가 대표적으로 있었습니다. 아래와 같은 코드에선 함수 내부에서 무한 루프에 빠져 함수가 종료되지 않으므로 반환값이 나오지 않습니다.

const func = (): never => {
  for (;;) {}
};

그리고 Error를 발생시켜서 함수가 종료되기 전에 코드를 종료시키는 함수에도 사용합니다.

const func = (): never => {
  throw new Error();
};

never 타입도 변수에 정의할 수 있긴합니다. never 타입을 변수에 정의할 경우 변수에 어떠한 값도 담을 수 없게됩니다.

0개의 댓글