본문 바로가기
TypeScript

0044. TypeScript 공부하기4 - Any, Unknown, Void, never, 업캐스팅/다운캐스팅(Feat. 타입 계층도, 타입 호환표)

by 보초코더^_^;; 2024. 1. 22.
반응형

섹션 2. 타입스크립트 기본

7강. Any 타입과 Unknown 타입

1) Any

특정 변수의 타입을 우리가 확실하게 모를 때 사용할 수 있는 타입

type 검사를 모두 다 통과하는 치트키 같은 타입

 

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

anyVar = true; //불리언
anyVar = {}; //객체
anyVar = () => {}; //함수

anyVar.toUpperCase(); //문자열에 쓰는거
anyVar.toFixed(); //숫자형에 쓰는거

let num: number = 10;
num = anyVar;

숫자, 문자 모두 쓸 수 있고, 함수 또한 모두 쓸 수 있다.

심지어 Any type에 숫자를 집어넣을 수도 있다.

 

하지만, 타입 검사를 하지 않고 넘어가기 때문에 Runtime에 에러가 발생하는 최악의 경우가 생긴다.

Any는 타입스크립트의 장점을 포기하는것과 마찬가지의 행위이기 때문에 가급적 쓰지 않는 것이 좋다.

 

 

2) Unknown

let unknownVar: unknown;

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

Unknown 타입도 변수의 타입으로 지정하면 이 변수는 모든 타입의 값을 다 할당받을 수 있다.

하지만 Any는 반대로도 가능한 반면에, Unknown은 반대로는 안된다고 생각하면 된다.

반대로는 안된다.

 

if(typeof unknownVar === "number"){
    num = unknownVar;
}

다만, 타입을 정제해서 쓰면 제한적으로 쓸 수 있다.

 

그래서 값이 지정되지 않았을 때는 Any 보다는 안전한 Unknown을 쓰는 것이 낫다.

 

 

8강. Void와 Never 타입

1) void

아무 것도 없음을 의미하는 타입

 

function func2(): void {
    console.log("hello");
}

아무런 값도 반환하지 않는 함수의 반환값 타입을 정의할 때 사용한다.

 

undefinced 외에는 모두 에러가 난다.

tsconfig.json에서 strickNullChecks옵션을 False 하면 이때는 void 타입 변수에 null도 담을 수 있지만 안 쓰는 게 좋다.

 

2) Never

존재하지 않는, 불가능한 타입

 

void와 다르게 never는 아무 것도 되지 않는다.

심지어 strictNullCheck도 통하지 않는다.

 

 

섹션 3. 타입스크립트 이해하기

1강. 타입스크립트 이해하기

타입스크립트를 이해한다는 것은?

  • 어떤 기준으로 타입을 정의하는지
  • 어떤 기준으로 타입간의 관계를 정의하는지
  • 어떤 기준으로 타입의 오류를 검사하는지

 

2강. 타입은 집합이다.

집합  : 동일한 속성과 특징을 갖고 있는 것을 모아놓은 것

 

1) 부모 타입/자식 타입, 슈퍼 타입/서브 타입

타입은 집합이기 때문에 부모자식관계가 발생한다.

이를 간단하게 표현하면 우측 그림처럼 된다.

 

저번에 나온 계층도도 이런 집합의 종속관계를 나타낸 것이다.

 

 

2) 타입 호환성

Number 리터럴 타입을 Number 타입으로 취급하는 것은 가능하지만,

Number 타입을 Number 리터럴 타입으로 취급하는 것은 불가능하다.

Number 타입이 슈퍼타입이기 때문이다.

 

3) 업캐스팅과 다운캐스팅

 

Down Cast : 대부분의 상황에서 안된다. (슈퍼타입 → 서브타입)

Up Cast : 모든 상황에서 가능하다. (서브타입 → 슈퍼타입)

 

 

3강. 타입 계층도와 함께 기본타입 살펴보기

1) Unknown 타입 : 전체집합

 

업 캐스팅은 모두 가능하지만, 다운캐스팅은 모두 안된다.

 

 

2) Never 타입 : 공집합

이 함수가 반환할 수 있는 값은 공집합이다. 즉, 아무것도 없다는 뜻

never는 공집합이기 때문에 모두 업케스팅이 가능하다.

function neverExam() {
    function neverFunc(): never{
        while (true) {}
    }

    let num: number = neverFunc();
    let str: string = neverFunc();
    let bool: boolean = neverFunc();
}

never 타입에는 아무런 값도 저장될 수 없다.

 

 

3) Void 타입

void는 중간에 들어있다.

계층도 상에서 undefined의 supertype이기 때문에 업캐스팅이 가능하다.

 

 

4) Any 타입

타입 계층도를 완전히 무시함

unknown을 다운캐스팅하는 것도 가능하고, 자신이 다운캐스팅 되는 것도 가능함.

그래서 위험한 타입이기 때문에 웬만해서는 사용하지 않는 것을 권장

 

둘 다 다운캐스팅인데 가능하다.

 

그럼에도 never로 다운캐스팅은 안된다.

never는 순수한 공집합이기 때문.

 

 

 

타입 호환표

 

계층도와 호환표 중에서 편한 것으로 사용하면 된다.

 

반응형