반응형
가변성
보통 A라는 타입이 V라는 다른 타입의 서브 타입인지 아닌지 쉽게 판단할 수 있습니다.
number, string 등의 단순 타입은 위의 흐름도로 확인하거나 자체적으로 쉽게 추론할 수 있습니다. (예: number는 number | string 유니온에 포함되므로 number | string의 서브 타입입니다.)
매개변수화된(제네릭) 타입 등 복합 타입에선 이 문제가 더 복잡해집니다.
아래의 상황을 살펴보겠습니다.
- Array<A>는 어떤 상황에서 Array<B>의 서브 타입이 될까요?
- 형태 A는 어떤 상황에서 다른 형태 B의 서브 타입이 될까요?
- 함수 (a: A) => B는 어떤 상황에서 다른 함수 (c: C) => D의 서브 타입이 될까요?
다른 타입을 포함하는 타입(Array<A>처럼 타입 매개변수를 갖거나, {a: number} 같은 필드를 갖는 형태 혹은 (a: A) => B) 같은 함수)의 서브 타입 규칙은 추론하기가 어려워서 명확하게 답변을 내놓긴 어렵습니다.
사실 이러한 복합 타입의 서브 타입 규칙은 프로그래밍 언어마다 다르며 같은 규칙을 가진 언어가 거의 없을 정도입니다.
앞으로 공부할 규칙들을 더 쉽게 읽을 수 있도록 타입을 더욱 정확하고 간단하게 설명할 수 있는 몇 가지 문법을 작성해 보겠습니다.
이 문법은 유효한 TypeScript는 아닙니다. 단지 타입을 쉽게 이해하기 위해 공유하는 약속일 뿐입니다.
- A <: B
- 'A는 B와 같거나 B의 서브 타입'
- A >: B
- 'A는 B와 같거나 B의 슈퍼 타입'
반응형
'👶 TypeScript' 카테고리의 다른 글
함수 가변성 (0) | 2023.01.18 |
---|---|
형태와 배열 가변성 (0) | 2023.01.18 |
서브 타입과 슈퍼 타입 (0) | 2023.01.17 |
디자인 패턴 - 빌더 패턴(builder pattern) (0) | 2023.01.17 |
디자인 패턴 - 팩토리 패턴(factory pattern) (0) | 2023.01.17 |