선요약
- 타입스크립트의 모든 타입은 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
'개발 > JavaScript & TypeScript' 카테고리의 다른 글
| TypeScript 6.0 발표 (0) | 2026.04.11 |
|---|---|
| 자바스크립트에서 함수와 디스 (this)의 이해 (0) | 2026.02.26 |
| 자바스크립트에서 심볼 (Symbol)을 사용하는 이유 (0) | 2026.02.26 |
| 프론트엔드 개발에서의 훅(hook)과 상태 관리에 대한 모든 것 (0) | 2026.01.04 |
| 리액트 네이티브 화면 구조 (0) | 2026.01.03 |
