더북(TheBook)

매우 복잡하게 타이핑되어 있습니다. 특히 -1부터 20까지의 정수가 나열되어 있는 배열은 무슨 역할일까요? 하나씩 분석해봅시다.

먼저 FlatArray를 객체의 배열 타입이라고 생각할 수 있는데, 배열 타입이 아니라 컨디셔널 타입을 인덱스 접근 타입으로 나타낸 것입니다(2.15절에서 배웠습니다). Depth-1이면 done 속성 값의 타입이므로 Arr이 되고, -1이 아니면 recur 속성 값의 타입이 됩니다. FlatArray 타입은 다음과 같이 보는 것이 올바른 분석입니다.

// Depth가 -1인 경우
type FlatArray<Arr, -1> = Arr;
// Depth가 -1이 아닌 경우
type FlatArray<Arr, Depth extends number> =
  Arr extends ReadonlyArray<infer InnerArr>
    ? FlatArray<InnerArr, [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth]>
    : Arr;

(number | (number | number[])[])[] 타입인 3차원 배열에 flat 메서드를 호출한 경우를 생각해봅시다. Arr은 3차원 배열의 타입일 것이고, Depth1일 것입니다. 착각하면 안 되는 것이 3차원 배열이라고 Depth3이 아닙니다. Depthflat 메서드가 낮출 차원 수입니다. 기본값은 1이죠. 그래서 FlatArray<(number | (number | number[])[])[], 1>[]에서 시작해야 합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.