개발/type-challenges

타입스크립트 타입 정복:타입의 구분

JonghwanWon 2022. 10. 29. 02:11

TypeScript의 Type은 어떻게 나누어지는가?

1. Static

정적 유형은 "컴파일 타임" 또는 "프로그램을 실행하지 않고" 이미 알고있는 유형을 의미

user-defined type(function, tuple, array, object ...), primitive type(string, number, boolean ...) 으로 세부 분류.

2. Generic

Generic은 단일 데이터 형식이 아닌 다양한 데이터 형식으로 작업할 수 있는 구성 요소를 만드는 데 사용

3. Decorators

클래스 선언, 메서드, 속성, 접근자 및 매개변수에 첨부할 수 있는 특수한 데이터 유형

Diagram of every possible TypeScript type

let any: any 
let number: number = 5
let never: never = any // ❌ ⬇️downcast(explicit)
// Type 'any' is not assignable to type 'never'.ts(2322)
never = number // ❌ ⬇️downcast(explicit)
number = never // ✅ ⬆️upcast(implicit)

❗️타입은 upcast로 할당 가능하며, 반대의 경우는 불가하다.

❗️never = 공집합, 즉 어떤 값도 가질 수 없다.

Null

null 값만 할당이 가능

함수 반환 유형 void와 never의 차이

“값이 없다.”는 의미로 같다고 생각할 수 있으나, 차이가 존재한다.

void

무시하려는 반환 값의 유형은 void가 된다.

JavaScript에서 반환 값이 없는 함수는 암묵적으로 undefined를 반환한다.

즉, 무시하려는 반환 값의 유형은 void가 된다.

// Type () => void

const getVoid2 = () => {};
const getVoid3 = function() {};

never

정상적으로 완료될 수 없는 반환 값.

즉, 오류 혹은 무한루프가 never로 표현 된다.

// Type () => never
const getNever1 = () => {
  while (true) {}
};

const getNever2 = function () {
  throw new Error();
};

참고사항

// ❗ Type () => void
function getNever31() {
  while (true) {}
}

함수 선언식은 왜 void로 추론될까? TypeScript never type inference