👶 TypeScript

가변성

개발자 린다씨 2023. 1. 17. 18:00
반응형

가변성

보통 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의 슈퍼 타입'
반응형