곱타입

곱타입은 집합 I 로 색인된 타입 Ti 의 목록입니다:

type Tuple1 = [string] // I = [0]
type Tuple2 = [string, number] // I = [0, 1]
type Tuple3 = [string, number, boolean] // I = [0, 1, 2]

// Accessing by index
type Fst = Tuple2[0] // string
type Snd = Tuple2[1] // number

구조체의 경우, I 는 label 의 집합입니다:

// I = {"name", "age"}
interface Person {
  name: string
  age: number
}

// label 을 통한 접근
type Name = Person['name'] // string
type Age = Person['age'] // number

곱타입은 다형적(polymorphic) 일 수 있습니다.

예제

//                ↓ 타입 파라미터
type HttpResponse<A> = {
  readonly code: number
  readonly body: A
}

왜 "곱"타입 이라 하는가?

만약 A 의 요소의 개수를 C(A) 로 표기한다면 (수학에서는 cardinality 로 부릅니다), 다음 방적식은 참입니다:

C([A, B]) = C(A) * C(B)

곱의 cardinality 는 각 cardinality 들의 곱과 같습니다

예제

null 타입의 cardinality 는 1 입니다. 왜냐하면 null 하나의 요소만 가지기 때문입니다.

문제: boolean 타입의 cardinality 는 어떻게 될까요?

예제

type Hour = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
type Period = 'AM' | 'PM'
type Clock = [Hour, Period]

Hour 타입은 12 개의 요소를 가지고 있습니다. has 12 members. Period 타입은 2 개의 요소를 가지고 있습니다. has 2 members. 따라서 Clock 타입은 12 * 2 = 24 개의 요소를 가지고 있습니다.

문제: 다음 Clock 타입의 cardinality 는 무엇일까요?

// 이전과 같음
type Hour = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
// 이전과 같음
type Period = 'AM' | 'PM'

// 형태만 다름, tuple 타입이 아님
type Clock = {
  readonly hour: Hour
  readonly period: Period
}

언제 곱타입을 쓸 수 있나요?

각 구성 요소가 독립적 이면 사용할 수 있습니다.

type Clock = [Hour, Period]

여기서 HourPeriod 는 독립적입니다: Hour 값이 Period 의 값을 바꾸지 않습니다. 모든 가능한 쌍 [Hour, Period]이치 에 맞고 올바릅니다.