ZeroCho / ts-book

타입스크립트 교과서 소스 코드
36 stars 5 forks source link

전자책 306페이지(전체화면 기준) 질문 #56

Open roider000 opened 3 months ago

roider000 commented 3 months ago

3.9 flat 분석하기 파트에서

만약 Depth가 22라서 인덱스 접근 타입이 undefined가 되면 어떻게 될까요? 이때는 최대한 flat한 타입이 나오게 됩니다.

// type R2 = 1 | 2 | 3type R = FlatArray<[[[[[[[[[[[[[[[[[[[[[[[1, 2, [3]]]]]]]]]]]]]]]]]]]]]]]], 21>; // type R = [1, 2, [3]] type R2 = FlatArray<[[[[[[[[[[[[[[[[[[[[[[[1, 2, [3]]]]]]]]]]]]]]]]]]]]]]]], 22>; // type R2 = 1 | 2 | 3

라고 되어있는데 22로 인해 FlatArray의 재귀 호출에서 두 번째 제너릭 인자로 undefined가 넣어지는데 그럼

type FlatArray<Arr, Depth extends number> = { "done": Arr, "recur": Arr extends ReadonlyArray ? 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 }[Depth extends -1 ? "done" : "recur"];

여기의 Depth extends number에서 타입 에러가 발생해야 하는 것 아닌가요? 왜 에러가 발생하지 않고 // type R2 = 1 | 2 | 3 이렇게 어쨌든 결과가 나오긴 나오는 것이죠?

ZeroCho commented 3 months ago

음 이건 저도 결괏값에 대해서는 정확하게 분석하기는 어렵네요. 일단 에러가 발생하지 않은 이유는 확실합니다. Depth extends number에서 22를 넣었기에 일단 에러가 발생하지 않는 것입니다. 22는 number니까요. 다만 [Depth] 부분에서는 [22]를 넣으면 에러가 나야하지만 타입스크립트는 [Depth] 그 자체를 판단합니다. Depth는 number니까 [Depth]는 [number]일 뿐입니다.