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]>에서 두 번째 타입 인수로 제공한 타입이 흥미롭습니다. 이 또한 인덱스 접근 타입입니다. Depth가 0이라면 -1이 되고, Depth가 1이라면 0이 됩니다. Depth가 21이라면 20이 되고, 22 이상인 경우에는 전부 undefined가 됩니다. 이는 차원을 한 단계씩 낮추는 것을 의미합니다. 결과적으로 Depth를 1 줄이는 효과를 얻게 됩니다. 타입스크립트에서는 숫자 리터럴 타입에 +나 - 같은 연산을 할 수 없습니다. 그래서 고육지책으로 저런 튜플을 만들어서 숫자를 변경하는 것 같은 효과를 얻는 것입니다.
만약 Depth가 22라서 인덱스 접근 타입이 undefined가 되면 어떻게 될까요? 이때는 최대한 flat한 타입이 나오게 됩니다.
type R = FlatArray<[[[[[[[[[[[[[[[[[[[[[[[1, 2, [3]]]]]]]]]]]]]]]]]]]]]]]], 21>;
// type R = [1, 2, [3]]
type R2 = FlatArray<[[[[[[[[[[[[[[[[[[[[[[[1, 2, [3]]]]]]]]]]]]]]]]]]]]]]]], 22>;
// type R2 = 1 | 2 | 3
R 타입까지는 제대로 추론되지만 R2에서는 제대로 추론되지 않습니다. 원래는 1 | 2 | [3]이 되어야 하는데 실제로는 1 | 2 | 3입니다. 이 타입은 원래 타입보다 한 번 더 flat된 타입입니다.