320x100
320x100

선요약

- 타입스크립트의 모든 타입은 unknown부터 never까지 계층을 이루며, 좁은 타입에서 넓은 타입으로만 안전하게 할당됨

- 객체 타입은 이름이 아니라 구조를 기준으로 호환성을 판단하며, extends 역시 결국 "할당 가능한가?"를 검사하는 문법

- Conditional Type, 제네릭 제약, 타입 좁히기는 모두 같은 타입 계층과 호환성 규칙 위에서 동작하는 개념

 

 

 

 

 

unknown과 never

타입 계층도의 맨 꼭대기에는 unknown이, 맨바닥에는 never가 위치

이 두 타입은 계층의 양극단을 이루는 특별한 존재

 

 

unknown

모든 타입의 슈퍼 타입 (최상위 타입)

어떤 값이든 unknown 타입 변수에 할당 가능

외부 API로 부터 어떤 형태의 데이터가 들어올지 알 수 ㅇ벗는 상황에서 유용하게 사용

 

모든 값을 받아들일 수 있따는 점에서 any와 비슷해 보이지만, 

unknown 타입의 값은 다른 타입 변수에 할당 할 수 없음

즉, 들어오는 것은 자유롭지만 나가는 것은 엄격하게 제한됨

 

 

never

모든 타입의 서브 타입 (최하위 타입)

절대 존재할 수 없는 값을 나타내며, 어떤 값도 never 타입 변수에 할당할 수 없음

실제로 never 타입이 되는 대표적인 경우는 항상 예외를 던지거나 무한 루프를 도는 함수의 반환 타입

하지만 never 자체는 모든  타입에 할당할 수 있음

 

 

 

 

 

any

any는 상하 관계로 설명할 수 있는 타입이 아닌, 타입 검사 자체를 우회하는 특별한 타입

모든 타입에 할당 할 수 있고, 모든 타입으로 부터 할당받을 수 있음

unknown과 never가 계층 규칙을 철저히 따르면서 안정성을 보장하는 반면, any는 그 규칙 자체를 비활성화함

 

any를 사용하면 타입 검사가 사실 상 무력화됨

타입스크립트를 사용하는 가장 큰 이유가 타입 안정성인데, any는 안정성을 스스로 포기하는 선택

따라서 가능한 한 unknown으로 대체하고 타입 좁히기를 통해 안전하게 사용함을 권장

 

 

 

 

 

기본 타입들의 위치

unknown과 never 사이에는 string, number, boolean 같은 원시 타입이 존재하고,

그 아래에 리터럴 타입이 존재

 

 

 

 

 

타입 호환성

업 캐스팅

좁은 타입을 넓은 타입에 할당하는 것

 

 

다운 캐스팅

넓은 타입을 좁은 타입에 할당하는 것

 

 

 

 

 

extends

extends는 주로 "할당 가능한가?"를 검사하는데 사용됨

 

 

Conditional Type의 extends

type IsString<T> = T extends string ? true : false;

 

T가 string의 서브타입인가?를 의미

즉, T가 string에 할당 가능한가를 묻는 것

타입 계층도에서 T가 string 보다 더 좁은 위치에 있으면 참

 

"hello"가 true가 되는 이유는 리터럴 타입이 원시 타입의 서브타입이기 때문

Exclude의 구현에도 같은 원리가 적용

 

 

제네릭 제약 조건의 extends

function getLength<T extends { length: number }>(arg: T): number {
  return arg.length;
}

 

T는 { length: number }의 서브타입이어야 한다는 의미

T가 최소한 length: number 프로퍼티를 가지고 있어야 한다는 의미

 

 

 

 

 

 

Reference

https://yozm.wishket.com/magazine/detail/3807/

 

타입 계층과 호환성, extends가 진짜 의미하는 것 | 요즘IT

타입스크립트를 사용하다 보면 extends라는 키워드를 다양한 곳에서 만나게 됩니다. Conditional Type에서는 T extends U ? X : Y 형태로, 제네릭에서는 T extends string 같은 제약 조건으로 등장합니다. 두 경

yozm.wishket.com

 

300x250
728x90